V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JKeita
V2EX  ›  问与答

PHP 异步执行 shell 命令

  •  
  •   JKeita · 2019-07-18 09:01:54 +08:00 · 4157 次点击
    这是一个创建于 1736 天前的主题,其中的信息可能已经有所发展或是发生改变。

    exec("nohup $[cd $basePath && zip -qr $dirTmp/$filename.zip ./*] > /dev/null 2>&1 &"); //压缩文件 命令如上,但是发现并没有异步执行,有没有什么办法可解决,最好不是另写一个 shell 脚本。

    20 条回复    2019-09-06 08:54:17 +08:00
    emeab
        1
    emeab  
       2019-07-18 09:23:28 +08:00
    shell_exec
    JKeita
        2
    JKeita  
    OP
       2019-07-18 09:27:26 +08:00
    @emeab 试过了没用
    leoleoasd
        3
    leoleoasd  
       2019-07-18 09:29:07 +08:00
    popen?
    JKeita
        4
    JKeita  
    OP
       2019-07-18 09:32:58 +08:00
    @leoleoasd 这个都直接不执行了。
    haiyan
        5
    haiyan  
       2019-07-18 09:34:07 +08:00
    换一个思路,建一个专门处理执行 shell 的 php,在你的 php 去 curl 这个执行命令的 php,设置超时一秒
    JKeita
        7
    JKeita  
    OP
       2019-07-18 09:47:18 +08:00
    @hteen 还是没有效果
    linxl
        8
    linxl  
       2019-07-18 10:08:01 +08:00
    没 log 吗, 你把 > /dev/null 改成输出到某个文件看看?
    JKeita
        9
    JKeita  
    OP
       2019-07-18 10:09:59 +08:00
    @linxl 用 bash 上可以,但是 php 执行就不能异步,不懂为什么
    linxiaojialin
        10
    linxiaojialin  
       2019-07-18 10:12:31 +08:00
    是 CGI 还是 CLI 呢?
    nohup 只是忽略 SIGHUP 信号,挂起在后台执行,不是异步执行,仍在当前线程( CGI )/进程( CLI )内。
    很多种思路,例如,1.PHP-CLI 下可开启新的线程 /进程去处理; 2.启动一个 PHP-CLI 进程专门负责监听,其他进程 /CGI 线程中需异步执行的丢到监听进程中。
    emeab
        11
    emeab  
       2019-07-18 10:31:47 +08:00 via iPhone
    不行就用 go 写个 rpc 服务 php 去调用
    AngryPanda
        12
    AngryPanda  
       2019-07-18 13:03:15 +08:00 via Android   ❤️ 1
    setsid 了解一下
    tailf
        13
    tailf  
       2019-07-18 13:30:39 +08:00
    PHP 本身是同步的,想支持异步需要专门实现,例如 curl 可以实现多个请求并发,或者使用 swoole。
    whahuzhihao
        14
    whahuzhihao  
       2019-07-18 13:58:37 +08:00
    pclose(popen('命令', 'r'));
    标准做法不是 popen 去处理吗
    v23x
        15
    v23x  
       2019-07-18 15:42:10 +08:00
    php 搞异步 劝你换一个语言....
    AlanAlbert
        16
    AlanAlbert  
       2019-07-18 16:04:26 +08:00 via Android
    创建守护进程?
    iyaozhen
        17
    iyaozhen  
       2019-07-18 16:17:09 +08:00 via Android
    不了解$[]语法干啥的。

    但 zip -qr $dirTmp/$filename.zip ./* 应该是阻塞了,你这后面加上&,后台运行
    cnqncom
        18
    cnqncom  
       2019-07-18 16:34:36 +08:00
    @v23x 你忘记这是全世界最好用的语言吗
    hetaoo
        19
    hetaoo  
       2019-09-05 19:19:26 +08:00
    楼主最后解决了吗?我也碰到一样的问题了
    JKeita
        20
    JKeita  
    OP
       2019-09-06 08:54:17 +08:00   ❤️ 1
    @hetaoo 最后是额外写个脚本文件去调用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   989 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:21 · PVG 04:21 · LAX 13:21 · JFK 16:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.