【问题标题】:shell_exec - logging & outputtingshell_exec - 记录和输出
【发布时间】:2011-07-06 10:08:47
【问题描述】:

我正在后台运行多个shell_execprocess.php

shell/ssh上,我执行如下代码:username [~/public_html/curl]# php index.php

示例....

index.php

<?php
 shell_exec("php process.php > /dev/null 2>&1 &");
 shell_exec("php process.php > /dev/null 2>&1 &");
 shell_exec("php process.php > /dev/null 2>&1 &");
 shell_exec("php process.php > /dev/null 2>&1 &");
?>

process.php

<?php
$section = rand(999,999999);
$z = 1;
print "STARTED .... \n";
while($z <= 10) {
 print "---------------------------------\n";
 print $section . ": " . $z . "\n";
 $z++;
 sleep(2);
}
print "LOOP FINISH at " . time();
?>

process.php's 运行时,我遇到了两个问题:

  1. 我看不到process.php 的输出(我需要知道他们在做什么)
  2. 我需要知道哪个过程已经完成,哪个过程已经开始。

实时记录输出的最佳方式是什么?保存到文本文件中?或者对mysql数据库(logs表)怎么做?

【问题讨论】:

标签: php linux shell exec


【解决方案1】:

如果您的进程仅在另一个 php 脚本的生命周期内有效,您可以使用 popen 代替 shell_exec:

http://us.php.net/popen

这为您提供了一种非常方便的方法,可以使用与文件句柄相同的接口将数据从其他进程获取到您的 php 脚本中。要知道该过程是否完成,您可以确保该过程在完成时发送一个 EOF(文件结尾),并使用 feof php 函数来检测它。

另一方面,如果您的进程可能比与之对话的任何其他 php 脚本寿命更长,那么文本文件可能是一个非常实用的解决方案。但是请记住,磁盘访问总是比内存访问慢得多,因此如果您使用文本文件进行通信,它不会是最佳速度。

【讨论】:

  • 一个进程可能需要比其他进程更长的时间。(进程将每天运行 15 小时)。进程必须同时执行..(不是在一个进程完成然后执行下一个进程时)。您如何看待这个解决方案:对于每个进程 - 它将输出保存到文本文件(例如:process_1.txt) - 然后我可以通过浏览器打开一个 txt 文件(每 5 秒刷新一次)?我正在寻找可以查看每个进程的输出/日志的解决方案。
  • 该解决方案有多好取决于您的需求。这听起来有点不雅,但如果它提供了您需要的功能,那就太好了。在让某些东西正常工作和编写漂亮的代码之间总是需要权衡取舍。听起来您的目标是让某些东西正常工作,这完全没问题。如果你让它工作并发现有些事情很慢,那么是时候寻找更优雅的解决方案了。
  • 泰勒,我想出了更好的解决方案。我将日志结果插入到 mysql 数据库(日志表)中,而不是保存到文本文件中。在日志表中,有一个名为 process_id 的字段用于 getmypid() ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多