php调用exec函数

PHP调用Perl脚本

在php中,经常遇到php调用外部脚本程序,如exec,system函数


本环境在windows平台下测试

在php中调用perl脚本, perl文件内容如下:

#!C:\xampp\perl\bin\perl
use JSON;
use Encode;

my $val = "helloworld\n";
my $jsonCoder = new JSON();
my $ret->{"perl"} = $val;
my $r = $jsonCoder->encode($ret);
print $r;
exit 0;

php操作如下:重点关注注释部分

$path = app_path() . '\storage\uploads\perl.pl';
$perl_cmd = 'C:\xampp\perl\bin\perl '.$path . ' 2>&1';  //perl的可执行文件也需要是完整路径 ,指令用单引号,双引号容易出问题
$return_val = -1;  // exec命令返回值   1  失败  0 成功
$result = exec($perl_cmd,$out,$return_val);
print_r($out);
echo "<br/>";
$result = json_decode($result,true);
var_dump($result);

### 如何在PHP中使用`exec`函数实现异步非阻塞操作 在PHP中,可以通过调用系统的命令来启动一个新的进程并使其独立于当前的PHP脚本运行。这通常通过组合使用`exec`或其他类似的函数(如`shell_exec`、`popen`等)以及一些操作系统特定的技术来完成。 #### 使用`exec`函数实现异步非阻塞的方式 为了使`exec`函数的行为是非阻塞的,可以在执行外部命令时附加某些标志位或重定向符,具体取决于所使用的操作系统: - **Linux/Unix环境** 可以通过追加 `> /dev/null 2>&1 &` 来让命令以后台模式运行,并忽略其标准输出和错误输出。这样可以防止子进程的标准输入输出流干扰到父进程[^3]。 示例代码如下: ```php function runAsyncCommand(string $command): void { exec(sprintf('%s > /dev/null 2>&1 &', escapeshellcmd($command))); } // 调用示例 runAsyncCommand('php posttest.php'); ``` - **Windows环境** Windows下则需要利用`start`命令来创建新的窗口会话或者无界面的任务线程。同样也需要考虑隐藏CMD窗口的情况,因此推荐加上额外参数 `/B` 和重定向符号 `NUL`。 示例代码如下: ```php function runAsyncCommandOnWindows(string $command): void { pclose(popen('start /B '.escapeshellcmd($command).' > NUL 2>&1', 'r')); } // 调用示例 runAsyncCommandOnWindows('php posttest.php'); ``` 注意上述例子中的`escapeshellcmd()` 函数是用来转义可能存在的特殊字符,从而避免潜在的安全风险,例如命令注入攻击等问题。 另外需要注意的是,在实际部署环境中还需要考虑到服务器配置方面的影响因素,比如前面提到过的关于PHP-FPM下的超时设定问题[^2],如果后台任务预计耗时较长,则应适当调整相关服务端限制条件以适应需求场景。 最后提醒一点,虽然这种方法可以让PHP发起一个不等待返回结果的操作流程,但对于更复杂的业务逻辑建议采用消息队列机制或是专门设计的工作调度框架来进行管理,这样才能更好地保障整个应用架构稳定性和可维护性。 ```php // Linux环境下简单封装方法 function asyncExecForLinux($cmd){ shell_exec("$cmd >/dev/null 2>/dev/null &"); } // Windows环境下简单封装方法 function asyncExecForWindows($cmd){ pclose(popen("start /b ".escapeshellcmd($cmd)." > nul", "r")); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值