php如何 使用多線程?

業務場景:從api介面獲取數據,插入到資料庫中,這個過程大概幾個小時,我想用多線程技術來改造,但不知如何下手。其他方式也行。

補充一句:對php未來方向不明,java有很多重量級東西,如hadoop,spark,storm等等,php何去何從?


其實,你這裡真是的需求,只是希望在Web這邊獲取一種方式,來執行一個長達數小時的「非同步」任務。就PHP而言,可以用2種方式來做:

(1)在PHP里使用shell_exec的函數,以shell的方式,啟動一個獨立的PHP腳本執行。這種方式,其實相當於在Web伺服器處理過程中,獨立起了一個shell進程處理你的任務。這裡,需要特別注意的是shell_exec的伺服器安全,注意校驗參數,小心避免被帶入shell命令中。這個是比較容易實現的方式。

(2)使用PHP實現一個Server,監聽一個埠,為Web端提供服務。這裡的實現方式有很多,通常要配合擴展,例如原生的pthread(多線程),開源擴展swoole等等。

直接在web程序里使用多線程,是不恰當的,web請求通常有時間限制,例如timeout默認是30秒。你如何保證,在線程任務執行完之前,它的父進程仍然在工作?


php 本身不支持多線程,不過有些擴展可以幫你做到


可以使用php的命令行模式運行,只不過這不是多線程,而是多進程。

更複雜的方式,可以使用gearman。


小菜說一下見解。

這個場景並不一定用多線程來解決吧。用多進程較穩定。

然後業務場景中。插入到資料庫中。是哪種資料庫呢。不會是因為寫鎖的問題嗎?

PHP用進程或者線程或者非同步等等都是可以的。很多大牛寫的擴展可以幫助你做到。至於業務場景下的性能得自己去測試了。

至於PHP的話,你可以多去了解別人所說的快和慢指的是什麼,7出來了的改進。同時PHP主要是web開發腳本。比較的意義在哪裡要懂得。

還有大牛一般並不只會一種語言吧。或者說的是不拘泥於一種語言。

all in interesting.

說的不好的地方望巨巨們指點。

-------------------------------------

閱讀完最新答案,補充一句,其實我也想說『非同步』解決就好。2333


多線程可以用擴展,php_pthreads,優點支持WIN和lin雙平台,缺點php必須運行在線程安全模式下,CGI方式運行就不要想了。


php中進程鎖和多進程的實現

這篇文章對進程鎖解釋的不錯,可以看看


首先定位程序的瓶頸,肯定是在mysql上。並行能否解決這個問題還要看你具體的存儲結構。

解決方案:

1、批量寫mysql,要比你並行寫快很多

2、使用php多進程框架,GitHub - huyanping/simple-fork-php: simple multi process manager based on pcntl 提供像java線程一樣的介面


簡單非同步,可以考慮popen(),fsockopen(),cURL;

複雜一些的,可以考慮PCNTL/pthreads擴展吧;

更複雜的,考慮消息隊列 -- 後台服務吧;

還有swoole!


pthreads

PHP 真正多線程的使用 - 張宴的博客 - Web系統架構與底層研發

pthreads - Manual


pthread 擴展


GitHub - hihoZhou/tasker: PHP application asynchronous task class 可以看下,不過是有多進程,不是多線程


試試garman


可以試一下多線程的curl


swoole


好了 Swoole: PHP的非同步、並行、分散式擴展,解決你的問題


PHP現在有很多可以優化的地方。

PHP7快要出來了,相當期待呀呀呀

然後推薦一個用C語言寫的牛逼擴展:Swoole: PHP的非同步、並行、分散式擴展,它還有對應的一套框架,在這個地址裡面也可以找到。可以了解了解~~相當有意思。


花2天學習nodejs,然後用async庫,很方便實現你的需求,很多東西配合起來用,比較好


多進程一樣的可以做到這個效果。


Spark是Scala寫的


推薦閱讀:

用php怎麼做以下這種需求?
如何處理iOS開發中 APP端資料庫和網站資料庫選擇和同步問題?
免費php網店(商城)系統有哪些?
如何從PHP過渡到golang?

TAG:PHP | PHP開發 | 多線程 | PHP學習 |