PHP不等待返回是指在一個腳本執(zhí)行的過程中,在調(diào)用其他程序時,不等待程序返回執(zhí)行結(jié)果,而是繼續(xù)執(zhí)行該腳本的后續(xù)任務(wù)。這種技術(shù)可以極大地提高程序效率,但同時也會帶來一些風(fēng)險。下面我們來深入了解一下這種技術(shù)的原理和應(yīng)用。
在很多需要進(jìn)行批量數(shù)據(jù)處理的程序中,比如需要將大量的圖片進(jìn)行壓縮的程序,使用curl_multi_init()函數(shù)的方式來并行處理會節(jié)省大量的時間。簡單的代碼示例如下:
$threads = curl_multi_init(); foreach ($urls as $key => $url) { $threads_data[$key] = curl_init($url); curl_setopt($threads_data[$key], CURLOPT_RETURNTRANSFER, 1); curl_multi_add_handle($threads, $threads_data[$key]); } $active = null; do { $return = curl_multi_exec($threads, $active); } while ($active); foreach ($urls as $key => $url) { $results[$key] = curl_multi_getcontent($threads_data[$key]); if (preg_match('/<title>(.*)<\/title>/s', $results[$key], $matches)) { echo $matches[1], "\n"; } curl_multi_remove_handle($threads, $threads_data[$key]); curl_close($threads_data[$key]); } curl_multi_close($threads);
這段代碼采用了異步并行的方式,在多個線程中同時執(zhí)行網(wǎng)絡(luò)請求,并且不等待返回結(jié)果。其中,curl_multi_exec()函數(shù)是用來執(zhí)行所有連接池中的請求,并且返回是否所有請求均已處理完成。如果某一個或多個請求未處理完,該函數(shù)會被調(diào)用阻塞,直到所有請求處理完。curl_multi_getcontent()函數(shù)則用來獲取返回數(shù)據(jù)。這種技術(shù)具有普適性,可以用來處理很多需要大量處理的數(shù)據(jù),例如掃描所有用戶的個人資料,或者批量獲取圖像信息等。
另外一種PHP不等待返回的方式是使用流媒體技術(shù)。在傳統(tǒng)的PHP應(yīng)用程序中,需要在下載文件時一次性完成文件下載,同樣,當(dāng)上傳數(shù)據(jù)時,需要等待數(shù)據(jù)完全上傳后再開始處理請求。而使用流媒體技術(shù)可以把數(shù)據(jù)塊化,在發(fā)送數(shù)據(jù)時不需要等待所有數(shù)據(jù)均傳輸?shù)椒?wù)器端,而是在傳輸?shù)揭欢ǔ潭葧r開始處理這些數(shù)據(jù)。
if (isset($_FILES['file']) && is_uploaded_file($_FILES['file']['tmp_name'])) { $filename = $_FILES['file']['name']; $filesize = $_FILES['file']['size']; $fp = fopen($_FILES['file']['tmp_name'], "rb"); if ($fp) { header("Content-Type: video/mp4"); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".$filesize); header("Accept-Ranges: bytes"); $buffer = 1024 * 1024; while (!feof($fp) && ($p = ftell($fp)) <= $filesize) { if ($p + $buffer > $filesize) { $buffer = $filesize - $p + 1; } set_time_limit(0); echo fread($fp, $buffer); flush(); } fclose($fp); } }
在這個例子里,我們使用了PHP的流媒體技術(shù),把文件緩存到服務(wù)器端,并在通過fwrite插入到緩存隊(duì)列中傳輸。需要注意的是,這里沒有使用set_time_limit()函數(shù)來控制上傳時間,服務(wù)器會直接將文件處理到本地文件。
總之,PHP不等待返回技術(shù)是一種非常重要的技術(shù),不僅可以加速程序的執(zhí)行速度,同時也能減輕處理大數(shù)據(jù)量的負(fù)擔(dān),但同時,開發(fā)者也需要注意風(fēng)險。因此,在使用PHP不等待返回技術(shù)時,需要注意代碼的可靠性,并在保證安全性的前提下充分利用這種技術(shù)的優(yōu)勢。