同步執(zhí)行
PHP 是線程安全的,并且在一個請求的處理過程中是不支持多線程的。 對于網(wǎng)絡(luò)請求來說,一個請求就是一個進程中的一個線程。
并且,PHP 中的所有代碼運行都是同步的,不存在異步執(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)的情況。
同步返回的好處是,你可以非常容易地控制整個請求的邏輯,不需要擔心多線程打亂你的邏輯,影響你的變量。
壞處也是很明顯的,你無法預知哪個請求會在什么時候鎖死在那里,因此,PHP腳本的執(zhí)行時間都會有一個時長限制(一般是 30s)。
代碼同步執(zhí)行的特性來源于 C 語言中的思想,而 PHP 把這套思想完全繼承下來了, 你只需要知道,在 PHP 的世界里,沒有多線程的包袱。