首頁  >  文章  >  後端開發  >  PHP多執行緒小案例

PHP多執行緒小案例

原創
2017-11-10 10:36:412138瀏覽

關於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多線程的小案例,但是希望大家可以開動大腦,也希望這篇文章能給大家帶來解決此類問題的思路。

相關推薦:

java - pthreads是PHP多執行緒的東西。

socket - 使用php多線程, 多進程

#PHP中多線程的兩個實作方法


以上是PHP多執行緒小案例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn