PHP 多執行緒解決方案
從JAVA跳到PHP之後,覺得PHP是種簡單的語言,以前用JAVA要寫好多行的程式,用PHP只要兩三行就能解決了。
但是我一直認為PHP就是因為太簡單,導致需要有些特殊的功能需要很花工夫才能達成,例如多執行緒。
現在,我找到解決方案了。
假設在JAVA上,需要多多執行緒的時候,都會像下面這樣這樣。
new Thread(new Runnable(){
public void run(){
//DO SOMETHING
}
}).start();
但是在PHP中,沒辦法做到這種事,不僅如此,就連執行到一半時,中斷跟client端的連線都沒辦法做到。
這會造成一些麻煩,雖然可以用
ob_flush();
flush();
強行印出資料,但如果不跟client端斷線的話,用戶端的瀏覽器會一直呈現讀取中的狀態,這種狀況很糟糕,我可不希望看到使用者在十幾二十秒的讀取時間中,點連結沒反應,javascript被鎖住,只能看著讀取中的圖示一直轉圈圈。
雖然PHP中有fastcgi_finish_request()這個方法可以中斷跟用戶端的連線,但這僅限於PHP-FPM有效,對於apache2沒辦法這樣做。
因此找到的簡單方法如下:
test2.php
echo “start<BR>\n";
$fp= popen(“nohup php /var/www/test.php > /dev/null &",’w’);
pclose($fp);
echo “OK “.date(“Y-m-d H:i:s");
test.php
$fp = fopen(‘/var/www/temp/output.txt’, ‘w’);
fwrite($fp, “START “.date(“Y-m-d H:i:s")." \n");
sleep(40);
fwrite($fp, “END “.date(“Y-m-d H:i:s")." \n");
fclose($fp);
其中,popen是指對系統下達SHELL指令,詳細的說明可以看 PHP Manual。
這邊我用的SERVER是Linux,所以用的是Linux的命令。
指令詳細的說明如下:
nohup :即使使用者斷線,也會繼續把指令跑完。
php /var/www/test.php:執行 /var/www/test.php 這隻php檔案
> /dev/null:把輸出的內容導到垃圾桶
&:在背景執行
呼叫完之後,用pclose把命令的串流給關掉,這樣一來,即使test.php那隻檔案沒有執行完,程式也會繼續跑下去。
另外關於test.php那隻檔案,應該不用多做解釋了吧?
就是開啟一個檔案,然後寫入檔案,中間暫停40秒,在寫入一行,並把檔案關掉。