PHP 中实现输出重定向

如果使用PHP来写一个后台程序,可能会考虑在程序中将标准输入、标准输出、标准错误给重定向,这样就不需要在启动程序的时候来做重定向(因为这样很容易忘记);在C中有比较正规的写法,但是PHP中没有找见对应的实现,今天想到一个变通的办法:
1. 使用ob_start(function); 来设置自定义的输出过滤器
2. 使用set_error_handler(function); 来实现自定义的标准错误处理器

然后,在自定义函数中就可以随意处理了,实例:

 
  1. <?php
  2. function my_stdout_handler($string) {
  3.         file_put_contents("4.log"$string, FILE_APPEND);
  4.         return ;
  5. }
  6. function my_error_handler($errno$errstr$errfile$errline) {
  7.         if (!(error_reporting() & $errno)) {
  8.                 // This error code is not included in error_reporting
  9.                 return;
  10.         }
  11.         switch ($errno) {
  12.                 case E_USER_ERROR:
  13.                         echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
  14.                         echo "  Fatal error on line $errline in file $errfile";
  15.                         echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
  16.                         echo "Aborting…<br />\n";
  17.                         exit(1);
  18.                         break;
  19.                 case E_USER_WARNING:
  20.                         echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
  21.                         break;
  22.                 case E_USER_NOTICE:
  23.                         echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
  24.                         break;
  25.                 default:
  26.                         echo "Unknown error type: [$errno] $errstr<br />\n";
  27.                         break;
  28.         }
  29.         /* Don’t execute PHP internal error handler */
  30.         return true;
  31. }
  32. ob_start(my_stdout_handler);
  33. set_error_handler(my_error_handler);
  34. print_r(ob_list_handlers());
  35. trigger_error("something wrong", E_USER_WARNING);

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据