没有系统调用的PHP异步

时间:2014-10-10 02:02:39

标签: php

由于去年我们的服务器遭到攻击,我已经通过php阻止了所有系统调用:

## php.ini
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, eval

但是这已经停止了我的异步功能工作,它用于在后台发送电子邮件。

在没有再次打开exec()函数的情况下,是否有纯粹的php'安全'方式进行异步调用?

function doEmail($subject,$body,$to){                    
    $pwd = realpath(dirname(__FILE__));
    $body = urlencode($body);
    $subject = urlencode($subject);
    $mailpage = $pwd."/email.php";
    $command = "$mailpage $subject $body $to";
    bgExecute($command);    

}

## Asyncronous PHP - Multi-Tasking (Email etc)
function bgExecute($command) {
    if (substr(php_uname(), 0, 7) == "Windows") pclose(popen("start /B ". $command, "r"));  // Windows
    $exec = "/usr/bin/php -f $command > /dev/null &"; // Ubuntu
    exec($exec);    
} 

1 个答案:

答案 0 :(得分:0)

好吧,如果你想继续发送任意命令而不允许发送任意命令,那么没有。

如果你问的是有没有办法按需执行外部应用程序,那么是的。

一种方法是将命令写入文件,并使另一个进程实际监视该文件以进行更改。

$filename = '/tmp/myfile.txt';
$prevMtime = 0;
while (true) {
  clearstatcache();
  //Do it in two steps just in case you have PHP < 5.4
  $mtime = stat($filename);
  $mtime = $mtime['mtime'];

  if ($mtime > $prevMtime) {
    $prevMtime = $mtime;
    print("file ${filename} changed\n");
  }
  usleep(10);
}

另一种方法是使用套接字来实现同样的目的。

问题在于,这些解决方案都不是银弹:如果你只允许执行任意命令,那么你几乎没有安全保障。

您需要定义所需的安全性。然后你需要决定你想要多大的灵活性。

可以做的一种方法是通过一个进程(基于套接字或文件)配置为只执行某个可执行文件列表并让PHP发送命令。