linux環境下有a.php和b.php,現在代碼關系如下,執行完a.php需要6秒以上時間,請問怎樣優化才能讓a.php在3秒內執行完?a.php
$test = new test();
$arr = ['重慶','山東','河北']
foreach($arr as $value){
$test->check($value)
}
b.php
class test
{
public function check($value){
sleep(2);
//后面會將結果寫入數據庫,不需要給返回值,此處不多寫了.
}
}
我想到的方法是將a.php改成下面這樣,但如果重慶,山東這些參數變成數組的話,又無法通過cli下傳遞過去(json_encode,serious等方法試過了,b.php接收后沒法還原成數組),請問應該如何處理?
$arr = ['重慶','山東','河北']
foreach($arr as $value){
exec('php b.php $value > /dev/null &')
}
9 回答

慕田峪7331174
TA貢獻1828條經驗 獲得超13個贊
php單進程是堵塞的,你用sleep(2) 肯定會延遲加載。每一次循環占用2秒時間。所以要想辦法變成多進程執行。
php curl_multi_exec 這個函數可以幫助你。

RISEBY
TA貢獻1856條經驗 獲得超5個贊
cli當然可以參數,不過只能傳字符串,你把數組json_encode,之后json_decode一下就可以了。不過,為什么不搞個隊列呢。。。如果你那個check需要執行那么久,肯定是數據量比較多了。。
搞個隊列,把數據一個個扔進去,然后b的處理進程可以根據數據的大小,設置開啟的進程數。。這樣速度肯定是1秒就能處理完了

繁花不似錦
TA貢獻1851條經驗 獲得超4個贊
但如果重慶,山東這些參數變成數組的話,又無法通過cli下傳遞過去(json_encode,serious等方法試過了,b.php接收后沒法還原成數組
我用json_encode可以還原成數組
a.php
<?php
$arr = [[1,2,3],[4,5,6],[7,8,9]];
foreach ($arr as $val) {
$val = json_encode($val);
$b = __DIR__ . '/b.php';
exec("nohup php $b $val >> b.out &");
}
b.php
<?php
$val = json_decode($argv[1]);
test::check($val);
class test {
public function check($val) {
sleep(2);
print_r($val);
}
}
b.out
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 4
[1] => 5
[2] => 6
)
Array
(
[0] => 7
[1] => 8
[2] => 9
)
- 9 回答
- 0 關注
- 585 瀏覽
添加回答
舉報
0/150
提交
取消