popen函数调本地脚本并传参数

老大要我实现一个php异步发邮件的功能,上网找了资料发现用popen就可以,于是初步写成这样:

pclose(popen("php -f mymail.php","r"));

这个脚本里就是一个用phpmailer发送一封邮件给我的账号。
现在想给这个功能传参数:
$to--收件人
$content--内容
$subject--标题。
这些是一个发邮件的功能必不可少的,
但是不知道要怎么写?
是在这条指令后加参数?如下,==可能这个靠谱点

php -f mymail.php -a $argv1 -b $argv2

还是有一个可以传参数的东西?(但是看popen这个函数4个参数都不是啊)

popen("balabala","r",$参数,$参数)

还是说强行写进去,然后直接用?类似下面这个意思

fopen("mymail.php","w");
fwrite $to balabala;
fwrite $subject balabala;
fclose(fopen(balabala));

初学php,有毛病多多包涵,请大家多多指教,==

阅读 8.6k
3 个回答

<?php
$parm1 = "*";
$parm2 = " -l";
$handler = popen ("/bin/ls ".$parm1.$parm2,"r");
$read = fread($handler,2048);
echo $read;
?>

这个等同运行命令:ls * -l ,所以,参数直接作为字符串传参给popen就好了。

pclose(popen("php /path/to/task.php '$arg1' '$arg2' '$arg3' >/dev/null 2>&1 &", 'r'));

比如变量$arg1是传递给脚本task.php的参数,task.php里通过$argv[1]拿到这个参数$arg1.

字符串参数$arg可以用单引号括起来,可以避免一些空格的影响,但还是有缺陷.
字符串参数最好还是serialize序列化到文件,
然后给脚本task.php传文件路径这个参数,
让task.php自己读文件unserialize反序列化拿数据.
文件名应该做到唯一,比如可以是用户ID+进程PID+时间随机数:
$filename = md5(uniqid('mail_'.$uid.'_'.getmypid().'_'.mt_rand(), true));

新手上路,请多包涵

popen:

$handle = popen("mymail.php","w");
$params = [
    'to' => 'xxx',
    'content' => 'xxx',
    'subject' => 'xxx',
];
fwrite($handle, serialize($params));
fclose($handle);

在mymail.php中:

$params = file_get_contents('php://stdin');

...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题