为了账号安全,请及时绑定邮箱和手机立即绑定

php代码优化问题

php代码优化问题

PHP
LEATH 2019-03-07 19:37:19
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 这个函数可以帮助你。

查看完整回答
反对 回复 2019-03-18
?
RISEBY

TA贡献1856条经验 获得超5个赞

cli当然可以参数,不过只能传字符串,你把数组json_encode,之后json_decode一下就可以了。不过,为什么不搞个队列呢。。。如果你那个check需要执行那么久,肯定是数据量比较多了。。
搞个队列,把数据一个个扔进去,然后b的处理进程可以根据数据的大小,设置开启的进程数。。这样速度肯定是1秒就能处理完了

查看完整回答
反对 回复 2019-03-18
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

你用cli执行,又不要结果,想要的东西就是队列啦,无非就是直接查询数据库的时间太久了,也可以试试NoSql

查看完整回答
反对 回复 2019-03-18
?
繁花不似锦

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
)
查看完整回答
反对 回复 2019-03-18
?
侃侃无极

TA贡献2051条经验 获得超10个赞

如果只是 单纯写入数据库,你可以先拼接成SQL,然后执行SQL查询即可。

查看完整回答
反对 回复 2019-03-18
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

队列, 或者 swoole

查看完整回答
反对 回复 2019-03-18
  • 9 回答
  • 0 关注
  • 556 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信