業務場景:從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秒。你如何保證,在執行緒任務執行完之前,它的父進程仍然在工作?
swoole
好了 Swoole: PHP的非同步、平行、分散式擴充
,解決你的問題
可以使用php的命令列模式運行,只不過這不是多線程,而是多進程。
更複雜的方式,可以使用gearman。
多進程一樣的可以做到這個效果。
php 本身不支援多線程,不過有些擴充可以幫你做到
小菜說一下見解。
這個場景不一定用多執行緒來解決吧。用多進程較穩定。
然後業務場景中。插入到資料庫中。是哪種資料庫呢。不會是因為寫鎖的問題嗎?
PHP用進程或執行緒或非同步等等都是可以的。很多大牛寫的擴充可以幫助你做到。至於業務場景下的效能得自己去測試了。
至於PHP的話,你可以多去了解別人所說的快和慢指的是什麼,7出來了的改進。同時PHP主要是web開發腳本。比較的意義在哪裡要懂得。
還有大牛一般不只一種語言吧。或者說的是不拘泥於一種語言。
all in interesting.
說的不好的地方望巨巨們指點。
-------------------------------------
讀完最新答案,補充一句,其實我也想說'異步'解決就好。 2333
多執行緒可以用擴展,php_pthreads,優點支援WIN和lin雙平台,缺點php必須運行在線程安全模式下,CGI方式運行就不要想了。
簡單非同步,可以考慮popen(),fsockopen(),cURL;
複雜一些的,可以考慮PCNTL/pthreads擴充吧;
更複雜的,考慮訊息佇列 -- 後台服務吧;
還有swoole!
首先定位程式的瓶頸,肯定是在mysql上。並行能否解決這個問題還要看你具體的儲存結構。
解決方案:
1、批次寫mysql,要比你並行寫快很多
2、使用php多進程框架,GitHub - huyanping/simple-fork-php: simple multi process manager based on pcntl
提供像java一樣的介面