關於PHP多線程,我們會遇到很多問題,以下這篇文章就是關於PHP多線程的小專案問題,同時我們提供了三種解決方案,請參考。
專案狀況:
要同步300W+的使用者資料到qcloud,只能每次一個curl同步,大概每秒同步3個,算下來同步完300W資料估計要10天+,所以想到用多執行緒解決。
方案1:
用c++寫多進程方案,fork多個行程出來解決。主線程負責讀取/存儲數據,子線程負責curl。
方案2:
用php寫多進程方案,同方案1.主執行緒讀取,子執行緒curl。
但是由於php沒有多進程,所以不能直接操控執行緒/進程。所以只能依賴linux來實現多進程。
php函數pcntl_fork()可以建立一個進程,等同於linux的fork。
和fork不同的是,pcntl_fork回傳的0是子進程,回傳的id是子進程的pid(而fork是父進程回傳0,子進程回傳ppid).
#注意pcntl_fork()函數必須要在linux上面才行,據說要載入pcntl.so模組,但看起來不載入也行。
方案3:
php+shell模擬多執行緒
例如:test.php檔案實作了專案所需功能(包含資料庫讀寫和curl)
再寫一份shell如下,儲存為start.sh:
#!/bin/bash //指定bash,必须for(( i=0; i<20; i++))do php test.php & //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。 sleep 1s done
最後執行該shell,sudo ./start.sh
shell會啟動20個行程同時分別執行test .php
但是由於每個進程都相當於主進程,所以共同的資源不好控制,這個case中,共同的資源只有資料庫,所以每次操作資料庫我都加鎖詳見我另一篇文章。 mysql lock。 因為相對於資料庫操作基本上都是每秒能解決,而curl連續發個幾百個需要幾十秒甚至更多,所以資料庫加鎖影響不大。
總結:雖然這只是一個關於PHP多線程的小案例,但是希望大家可以開動大腦,也希望這篇文章能給大家帶來解決此類問題的思路。
相關推薦:
以上是PHP多執行緒小案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!