在 php 中运行 shell_exec 会导致 Web 服务器挂起

发布于 2024-12-12 13:16:44 字数 857 浏览 0 评论 0原文

我正在运行以下代码。它的作用是获取一个文本文件,将其分割成以“_part”结尾的部分,然后调用带有标志的相同脚本来处理文件 - 将内容上传到 Drupal 系统。

发生的情况是脚本运行并完成工作,所有调用的脚本也完成,我可以看到结果。但每次运行后,网络服务器都会停止响应。我有什么基本的遗漏或做错了吗?

  if(isset($argv[3])){
    $isSplit = $argv[3] == 'true' ? true : false;
  }      
  if($isSplit){                  
    $fileSplitter = new CSVFileParts($fileName);
    $parts = $fileSplitter->split_file();
    echo 'Splited file to '.$parts.' parts'.PHP_EOL;
    for($part =0; $part < $parts; $part++){            
      echo shell_exec('php Service.php u ./partial_files/'.basename($fileName).'.part_'.$part.' false > /dev/null 2>/dev/null &');
    }        
  }else{                            
    $log->lwrite('uploading '.$argv[2]); 
    $drupalUploader = new DrupalUploader($fileName, $log);
    $drupalUploader->upload();        
  }

I am running the following code. What it does is take a text file, splits it into parts that end with '_part' ending and than calls the same script with a flag to process the files - uploading the content to a Drupal system.

What happens is that the script runs and finishes the work, all invoked scripts finish too and I can see the results. but each time after I run it the web server stops responding. Is there anything basic that I am missing or doing wrong?

  if(isset($argv[3])){
    $isSplit = $argv[3] == 'true' ? true : false;
  }      
  if($isSplit){                  
    $fileSplitter = new CSVFileParts($fileName);
    $parts = $fileSplitter->split_file();
    echo 'Splited file to '.$parts.' parts'.PHP_EOL;
    for($part =0; $part < $parts; $part++){            
      echo shell_exec('php Service.php u ./partial_files/'.basename($fileName).'.part_'.$part.' false > /dev/null 2>/dev/null &');
    }        
  }else{                            
    $log->lwrite('uploading '.$argv[2]); 
    $drupalUploader = new DrupalUploader($fileName, $log);
    $drupalUploader->upload();        
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

养猫人 2024-12-19 13:16:44

shell_exec — 通过 shell 执行命令并以字符串形式返回完整的输出

shell_exec 期望文件句柄打开,但您将所有内容重定向到 /dev/null 并将其分离。

当您计划分离进程并删除所有输出时,您应该使用 exec() 和 escapeshellcmd()

请参阅: http://www.php.net/manual/en/function.exec.php

shell_exec — Execute command via shell and return the complete output as a string

shell_exec expects the file handle to be open, but you redirect everything to /dev/null and detach it.

As you plan to detach the process and remove all the output, you should use exec() and escapeshellcmd()

see: http://www.php.net/manual/en/function.exec.php

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文