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連續發個幾百個需要幾十秒甚至更多,所以數據庫加鎖影響不大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM