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秒,在寫入一行,並把檔案關掉。

 

Comments are closed.

Welcome , today is 星期二, 2017/09/26