首頁  >  文章  >  後端開發  >  php異步資料執行的方法

php異步資料執行的方法

墨辰丷
墨辰丷原創
2018-06-05 16:08:522751瀏覽

本篇主要介紹php非同步資料執行的方法,有興趣的朋友參考下,希望對大家有幫助。

程式碼如下:

<?php 
$count = count($emailarr);
for($i =0; $i < $count; $i++) 
{ 
  sendmail();//发送邮件 
} 
?>

這段程式碼使用者體驗極差,也無法實際運用,首先發送這麼多郵件會產生伺服器運作逾時,其實漫長的使用者等待時間會讓使用者對系統產品懷疑和失去信心。但是用戶不需要等待到1000封郵件都發送完畢了才提交發送成功,我們完全可以提交後台後直接給用戶提示發送成功,然後讓後台程序靜默依次發送。
這個時候我們就需要「非同步執行」技術來執行程式碼,非同步執行的特點是後台靜默執行,使用者無需等待程式碼的執行結果,使用非同步執行的好處:

  • 擺脫了應用程式對單一任務的依賴性

  • #提高了程式的執行效率

  • 提升了程式的擴充功能

  • 在一定場景提高了使用者體驗

  • 因為PHP不支援多線程,使用非同步呼叫的請求多個HTTP的方式達到了程式並行執行效果,但注意的是請求的HTTP過多的話,會大大加大了系統的開銷

## PHP非同步執行的常用方式1. 用戶端頁面採用AJAX技術請求伺服器最簡單的辦法就是在傳回給客戶端的HTML程式碼中,嵌入AJAX調用,或者,嵌入一個img標籤,src指向要執行的耗時腳本。這種方法最簡單,也最快。伺服器端不用做任何的呼叫。 但是缺點是,一般來說Ajax都應該在onLoad以後觸發,也就是說,用戶點開頁面後,就關閉,那就不會觸發我們的後台腳本了。
而使用img標籤的話,這種方式不能稱為嚴格意義上的非同步執行。使用者瀏覽器會長時間等待php腳本的執行完成,也就是使用者瀏覽器的狀態列一直顯示還在load。當然,也可以使用其他的類似原理的方法,例如script標籤等等。

2. popen()函數resource popen ( string command, string mode );開啟一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。開啟一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。所以可以透過呼叫它,但忽略它的輸出。
pclose(popen("/home/xinchen/backend.php &", 'r'));
這個方法避免了第一個方法的缺點,而且也很快。但問題是,這種方法不能透過HTTP協定請求另外的一個WebService,只能執行本地的腳本檔案。並且只能單向打開,無法穿著大量參數給被呼叫腳本。而且如果,訪問量很高的時候,會產生大量的進程。如果使用到了外部資源,還要自己考慮競爭。

3. CURL擴展CURL是一個強大的HTTP命令列工具,可以模擬POST/GET等HTTP請求,然後得到和提取數據,顯示在"標準輸出"(stdout)上面。

$ch = curl_init();
$curl_opt = array(CURLOPT_URL, &#39;http://www.example.com/backend.php&#39;,
       CURLOPT_RETURNTRANSFER, 1,
       CURLOPT_TIMEOUT, 1,);
 
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);

使用CURL需要設定CUROPT_TIMEOUT為1(最小為1,鬱悶)。也就是說,客戶端至少必須等待1秒鐘。


4. fscokopen()函數fsockopen是一個非常強大的函數,支援socket編程,可以使用fsockopen實現郵件發送等socket程式等等,使用fcockopen需要自己手動拼接出header部分。

$fp = fsockopen(www.jb51.net, 80, $errno, $errstr, 30);
if (!$fp) {
 echo "$errstr ($errno)<br />\n";
} else {
 $out = "GET /backend.php / HTTP/1.1\r\n";
 $out .= "Host: www.jb51.net\r\n";
 $out .= "Connection: Close\r\n\r\n";
 
 fwrite($fp, $out);
 /*忽略执行结果
 while (!feof($fp)) {
  echo fgets($fp, 128);
 }*/
 fclose($fp);
}

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。

相關推薦:

PHP flush 函數的使用注意事項

#php微信開發自訂選單的方法分享

php微信開發存取實例詳解

以上是php異步資料執行的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn