同步執行
PHP 是線程安全的,并且在一個請求的處理過程中是不支持多線程的。 對于網絡請求來說,一個請求就是一個進程中的一個線程。
并且,PHP 中的所有代碼運行都是同步的,不存在異步執行的代碼。
例子
于是我們可以對比 OC 和 Swift 中的多線程,假定在各自語言中抓取一個網頁的數據。
在OC中,我們一般使用異步線程操作網絡請求
[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 庫,網絡請求都是同步,上面的請求在 PHP 中可以這樣寫。
<?php
$str = file_get_contents("http://www.baidu.com")
echo $str;
請記住,如果你不為 file_get_contents 設定超時,這個請求將一定鎖定在 file_get_contents 這里直到請求返回數據為止。
優劣
同樣的,如果你從緩存中獲取數據或是從數據庫中獲取數據,所有的操作都是同步的,不存在異步回調的情況。
同步返回的好處是,你可以非常容易地控制整個請求的邏輯,不需要擔心多線程打亂你的邏輯,影響你的變量。
壞處也是很明顯的,你無法預知哪個請求會在什么時候鎖死在那里,因此,PHP腳本的執行時間都會有一個時長限制(一般是 30s)。
代碼同步執行的特性來源于 C 語言中的思想,而 PHP 把這套思想完全繼承下來了, 你只需要知道,在 PHP 的世界里,沒有多線程的包袱。