同步執(zhí)行
PHP 是線程安全的久锥,并且在一個請求的處理過程中是不支持多線程的家淤。 對于網(wǎng)絡(luò)請求來說,一個請求就是一個進(jìn)程中的一個線程瑟由。
并且絮重,PHP 中的所有代碼運(yùn)行都是同步的,不存在異步執(zhí)行的代碼歹苦。
例子
于是我們可以對比 OC 和 Swift 中的多線程青伤,假定在各自語言中抓取一個網(wǎng)頁的數(shù)據(jù)。
在OC中暂氯,我們一般使用異步線程操作網(wǎng)絡(luò)請求
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]] queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
if (data != nil) {
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
但是潮模,在 PHP 中,除非使用 curl 庫痴施,網(wǎng)絡(luò)請求都是同步擎厢,上面的請求在 PHP 中可以這樣寫。
<?php
$str = file_get_contents("http://www.baidu.com")
echo $str;
請記住辣吃,如果你不為 file_get_contents 設(shè)定超時动遭,這個請求將一定鎖定在 file_get_contents 這里直到請求返回數(shù)據(jù)為止。
優(yōu)劣
同樣的神得,如果你從緩存中獲取數(shù)據(jù)或是從數(shù)據(jù)庫中獲取數(shù)據(jù)厘惦,所有的操作都是同步的,不存在異步回調(diào)的情況哩簿。
同步返回的好處是宵蕉,你可以非常容易地控制整個請求的邏輯,不需要擔(dān)心多線程打亂你的邏輯节榜,影響你的變量羡玛。
壞處也是很明顯的,你無法預(yù)知哪個請求會在什么時候鎖死在那里宗苍,因此稼稿,PHP腳本的執(zhí)行時間都會有一個時長限制(一般是 30s)。
代碼同步執(zhí)行的特性來源于 C 語言中的思想讳窟,而 PHP 把這套思想完全繼承下來了让歼, 你只需要知道,在 PHP 的世界里丽啡,沒有多線程的包袱谋右。