最近被同事問到一個問題
"PHP 在網頁上能做到從一支程式去觸發另一支程式嗎?
最後這二支程式都是同時獨立運行"
因為之前有寫過 PHP 的多緒行緒
感覺上是沒問題
不過深入了解後發現
其實同事的目的不需要用到多執行緒
只要用 curl  再搭配其他的 trick 就行了
用到多執行緒有點大材小用又不好寫
加上他說在 windows 上的 PHP 沒有支援多執行緒(真是殘念)

運作方式

在 A.php 用 curl (設 timeout = 1) 丟 request 給 B.php
B.php 的 ignore_user_abort、set_time_limit 可讓 B.php 在後端繼續執行
不會因連線狀態中止而停止執行
而 curl 的 timeout 設為 1
會讓 A.php 連線一秒後就斷線
所以 A.php 就繼續往下執行
而 B.php 也會繼續執行

程式寫法

A.php:跑二個迴圈,中間丟一個 request 給 B.php

$i = 0;

do{
	echo $i;

	$i++;
	if($i > 10)
		break;

}while(true);

echo "
"; $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_setopt($ch, CURLOPT_URL, "http://www.xxx.com/b.php"); curl_exec($ch); curl_close($ch); $i = 0; do{ echo $i; $i++; if($i > 10) break; }while(true);

B.php:一秒產生一個檔案

ignore_user_abort(true);
set_time_limit(0);
$interval = 1;
$i = 0;

do{
	sleep($interval);

	$str = "Hello World";
	$file = fopen($i.".txt","a+"); //開啟檔案
	fwrite($file,$str);
	fclose($file);

	$i++;
	if($i > 10)
		break;

}while(true);

結論

瀏覽器向伺服器取得網頁
是以送出一個 request 跟接收一個 response 為一個循環
但是瀏覽器等待 response 時間太久
等到 timeout 時也會中斷連線
所以利用 curl、timeout、ignore_user_abort、set_time_limit
就可以解決同事的問題
另外 ajax 應該也可以去觸發 B.php
ajax 只負責去丟 request
完全不用理會 response
這也是另一種方式