導航:首頁 > 編程語言 > php多線程採集

php多線程採集

發布時間:2022-07-09 06:07:18

php採集大數據的方案

1、建議你讀寫數據和下載圖片分開,各用不同的進程完成。
比如說,取數據用get-data.php,下載圖片用get-image.php。

2、多進程的話,php可以簡單的用pcntl_fork()。這樣可以並發多個子進程。
但是我不建議你用fork,我建議你安裝一個gearman worker。這樣你要並發幾個,就啟幾個worker,寫代碼簡單,根本不用在代碼里考慮thread啊,process等等。

3、綜上,解決方案這樣:
(1)安裝gearman worker。
(2)寫一個get-data.php,在crontab里設置它每5分鍾執行一次,只負責讀數據,然後把讀回來的數據一條一條的扔到 gearman worker的隊列里;
然後再寫一個處理數據的腳本作為worker,例如叫process-data.php,這個腳本常駐內存。它作為worker從geraman 隊列里讀出一條一條的數據,然後跟你的資料庫老數據比較,進行你的業務邏輯。如果你要10個並發,那就啟動10個process-data.php好了。處理完後,如果圖片地址有變動需要下載圖片,就把圖片地址扔到 gearman worker的另一個隊列里。
(3)再寫一個download-data.php,作為下載圖片的worker,同樣,你啟動10個20個並發隨便你。這個進程也常駐內存運行,從gearman worker的圖片數據隊列里取數據出來,下載圖片

4、常駐進程的話,就是在代碼里寫個while(true)死循環,讓它一直運行好了。如果怕內存泄露啥的,你可以每循環10萬次退出一下。然後在crontab里設置,每分鍾檢查一下進程有沒有啟動,比如說這樣啟動3個process-data worker進程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php >> /dev/null 2>&1'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php >> /dev/null 2>&1'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php >> /dev/null 2>&1'

不知道你明白了沒有

⑵ php多線程採集 如何提高效率

sybase_connect
連上資料庫。
語法: int sybase_connect(string [servername], string [username], string [password]);
返回值: 整數
函數種類: 資料庫功能
本函數用來打開與 Sybase 資料庫的連接。參數 servername 為欲連上的資料庫伺服器名稱。參數 username 及 password 可省略,分別為連接使用的帳號及密碼。使用本函數需注意早點關閉資料庫,以減少系統的負擔。連接成功則返回資料庫的連接代號,失敗返回 false 值。

⑶ php curl 大量數據採集

這個需要配合js,打開一個html頁面,首先js用ajax請求頁面,返回第一個頁面信息確定處理完畢(ajax有強制同步功能),ajax再訪問第二個頁面。(或者根據伺服器狀況,你可以同時提交幾個URL,跑幾個相同的頁面)
參數可以由js產生並傳遞url,php後台頁面根據URL抓頁面。然後ajax通過php,在資料庫或者是哪裡設一個標量,標明檢測到哪裡。由於前台的html頁面執行多少時候都沒問題,這樣php的內存限制和執行時間限制就解決了。
因為不會浪費大量的資源用一個頁面來跑一個瞬間500次的for循環了。(你的500次for循環死了原因可能是獲取的數據太多,大過了php限制的內存)
不過印象中curl好像也有強制同步的選項,就是等待一個抓取後再執行下一步。但是這個500次都是用一個頁面線程處理,也就是說肯定會遠遠大於30秒的默認執行時間。

⑷ php真的有多進程,多線程嗎

通常意義上所說的多進程是由apache調度的,比如html頁面同時發送5個ajax請求的時候,那麼5個php進程會幾乎同時進行。
PHP本身是不存在多線程的,總是單線程的方式執行。

誤區就是PHP可以通過特別的手段用多進程的方式來模擬多線程,不過幾乎用不到。因為PHP不像java之類的本身有進程管理機制,因此模擬的多線程非常不好控制,同時效率也並不高。

⑸ php多線程問題

header('location:http://xxxx');每次執行完畢,用這個定向一下唄

⑹ php多線程

以下都是轉載, 簡單說下, php是不支持多線程的。。。。

PHP語言本身是不支持多線程的. 總結了一下網上關於PHP模擬多線程的方法, 總的來說, 都是利用了PHP的好夥伴們本身所具有的多線程能力. PHP的好夥伴指的就是LINUX和APACHE啦, LAMP嘛.

另外, 既然是模擬的, 就不是真正的多線程. 其實只是多進程. 進程和線程是兩個不同的概念. 好了, 以下方法都是從網上找來的.

1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待進程結束
$intNum = 10; /// 進程總數
$pids = array(); /// 進程PID數組
echo ("Startn");
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 產生子進程,而且從當前行之下開試運行代碼,而且不繼承父進程的數據信息
if(!$pids[$i]) {
// 子進程進程代碼段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>

當然啦,也可以把需要多線程處理的部分交給JAVA去處理, 然後在PHP里調用, 哈哈.

<?php
system('java multiThread.java');
?>

⑺ PHP支持多線程嗎

PHP語言本身是不支持多線程的。網上關於PHP模擬多線程的方法,都是利用了LINUX和APACHE等本身所具有的多線程能力。既然是模擬的,就不是真正的多線程,其實只是多進程。
1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待進程結束
$intNum = 10; /// 進程總數
$pids = array(); /// 進程PID數組
echo ("Startn");
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 產生子進程,而且從當前行之下開試運行代碼,而且不繼承父進程的數據信息
if(!$pids[$i]) {
// 子進程進程代碼段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>

也可以把需要多線程處理的部分交給JAVA去處理,然後在PHP里調用。

<?php
system('java multiThread.java');
?>

⑻ php怎麼使用隊列來處理批量採集

首先,隊列的作用不是批量處理,而是延時處理,也叫非同步處理
要做批量採集的話,首先你要劃分好區間,可以用php的多進程,也可以用php的cli模式做,只要數據不竄就行

⑼ php使用3種方法實現數據採集 什麼叫採集

下面的php代碼可以將HTML表格的每行每列轉為數組,採集表格數據
<?php function get_td_array($table) { $table = preg_replace("'<table[^>]*?>'si","",$table); $table = preg_replace("'<tr[^>]*?>'si","",$table); $table = preg_replace("'<td[^>]*?>'si","",$table); $table = str_replace("</tr>","{tr}",$table); $table = str_replace("</td>","{td}",$table); //去掉 HTML 標記 $table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table); //去掉空白字元 $table = preg_replace("'([rn])[s]+'","",$table); $table = str_replace(" ","",$table); $table = str_replace(" ","",$table); $table = explode('{tr}', $table); array_pop($table); foreach ($table as $key=>$tr) { $td = explode('{td}', $tr); array_pop($td); $td_array[] = $td; } return $td_array; } ?>

⑽ 有沒有可能在 PHP 中實現多線程

你要知道小伙PHP的程序是一樣一樣的運行的
只能偽多線程

閱讀全文

與php多線程採集相關的資料

熱點內容
自己購買雲主伺服器推薦 瀏覽:419
個人所得稅java 瀏覽:760
多餘的伺服器滑道還有什麼用 瀏覽:189
pdf劈開合並 瀏覽:26
不能修改的pdf 瀏覽:750
同城公眾源碼 瀏覽:488
一個伺服器2個埠怎麼映射 瀏覽:297
java字元串ascii碼 瀏覽:78
台灣雲伺服器怎麼租伺服器 瀏覽:475
旅遊手機網站源碼 瀏覽:332
android關聯表 瀏覽:945
安卓導航無聲音怎麼維修 瀏覽:332
app怎麼裝視頻 瀏覽:430
安卓系統下的軟體怎麼移到桌面 瀏覽:96
windows拷貝到linux 瀏覽:772
mdr軟體解壓和別人不一樣 瀏覽:904
單片機串列通信有什麼好處 瀏覽:340
游戲開發程序員書籍 瀏覽:860
pdf中圖片修改 瀏覽:288
匯編編譯後 瀏覽:491