php異步執行其餘程序

這裏的「其餘程序」,多是linux命令,多是其餘的php文件。php

網上說法有四種。分別爲:linux

一、經過加載頁面的時候經過ajax技術異步請求服務器ajax

二、經過popen()函數瀏覽器

三、經過curl擴展服務器

四、經過fscokopen()函數curl

 

說說個人見解!異步

經過ajax技術

不推薦函數

若須要異步執行的「程序」太過於耗時,而用戶此時若關閉了瀏覽器的話,通常若是沒有作什麼特殊配置或者服務器端代碼沒有作特殊處理的話,服務器端的代碼會終止執行。這就致使了這個「程序」執行並不完整,形成數據缺失,會對項目有影響。url

固然,若是說在代碼中加入ignore_user_abort(true)方法的話,是能夠忽略瀏覽器是否關閉而將該腳本執行完。spa

經過popen()函數

親測可用,且必須在php.ini中註釋掉disable_functions,這樣popen函數才能使用。

該函數打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生。因此能夠經過調用它,但忽略它的輸出

resource popen ( string $command , string $mode )

$command:linux命令

$mode:模式。

返回一個和 fopen() 所返回的相同的文件指針,只不過它是單向的(只能用於讀或寫)而且必須用 pclose() 來關閉。此指針能夠用於fgets()fgetss() 和 fwrite()。 當模式爲 'r',返回的文件指針等於命令的 STDOUT,當模式爲 'w',返回的文件指針等於命令的 STDIN。

若是出錯返回 FALSE

優勢:避免了第一個方法的缺點,而且也很快。
缺點:這種方法不能經過HTTP協議請求另外的一個WebService,只能執行本地的腳本文件。而且只能單向打開,沒法穿大量參數給被調用腳本。而且若是,訪問量很高的時候,會產生大量的進程。若是使用到了外部資源,還要本身考慮競爭。

注:$command必須是linux命令

案例:

1 $popen_cmd = '/usr/local/php/bin/php /home/zhixingjiaoben/erp_sync_stock.sh &';
2 pclose(popen($popen_cmd, 'r'));

 

經過curl擴展

驗證可行

1 $ch = curl_init();        
2 $curl_opt = array(
3     CURLOPT_URL=>'hostname/syncStock.php',
4     CURLOPT_RETURNTRANSFER=>1,
5     CURLOPT_TIMEOUT=>1,);        
6 curl_setopt_array($ch, $curl_opt);        
7 $out = curl_exec($ch);        
8 curl_close($ch);

原理:經過curl去調用一個php腳本,若是響應時間超過了1秒鐘,則斷開該鏈接,程序繼續往下走而syncStock.php這個腳本還在繼續往下執行。

缺點:必須設置CURLOPT_TIMEOUT=>1這個屬性,因此致使客戶端必須至少等待1秒。可是這個屬性不設置又不行,不設置的話,就會一直等待響應。就沒有異步的效果了。

經過fscokopen()函數

待驗證

相關文章
相關標籤/搜索