呵呵噠,
項目情況:
要同步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連續發個幾百個需要幾十秒甚至更多,所以數據庫加鎖影響不大。