PHP串行调用系统命令延时问题

2024-02-29 09:58

本文主要是介绍PHP串行调用系统命令延时问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

夜已深了,这是第三个夜。对一个不知天高地厚的菜鸟程序猿来说,用PHP对所要做的事情串行起来并调用一下外部命令并没有什么难点,然而书到用时方恨少啊!

先说主要人物:PHP调用外部命令的函数system()。这个函数在调用shell命令的时候会把返回结果打印出来。但是当返回结果相当庞大时,它就会掉链子导致程序卡死。当然强大的机器也有解决方案就是将返回结果打印到一个文件中。像这样system('gradle bulid > abc.txt');这样所有的返回结果都会写入到当前文件夹下的abc.txt文件中而不会影响程序的运行。

如果你是冲着标题来的,看到这里您的问题应该得到解决。下面是我这几天关于程序串行,调用外部命令的自我总结。

首先,有一个这样的任务:用户有一些可以编译的java文件,每当用户请求时,后台自动将这些文件编译为可操作程序。编译过程会对服务器带来不小的压力所以不允许同时执行。串行程序我的想法是利用数据库。

每个用户的请求存入数据,当执行该用户的请求时改变记录状态。循环执行数据库中所有的记录并删除。

<?php
error_reporting(E_ALL^E_NOTICE^E_WARNING);
ini_set('max_execution_time', '0');
/**
*省略插入操作
*/
$sql1 = "select * from table order by `id` ASC";
$item1=mysql_query($sql1,$conn);
$row = mysql_fetch_array($item1,MYSQL_ASSOC);
if(!$row || $row['statue']==1){die("正在编译中。。");//编译中退出命令
}while(true){$sql = "select `id` from table order by id";$item=mysql_query($sql,$conn);$search = mysql_fetch_row($item);if(!$search){//如果队列中没有数据,则结束定时器break;}//更新状态 编译中$sqlup='UPDATE table SET `statue` = 1 WHERE id ='. $search[0];mysql_query($sqlup,$conn);
//执行编译命令$result=system("cd". $search["0"]." && gradle build > abc.txt");$delsql="delete from table where `id`= '$search[0]'";mysql_query($delsql,$conn);sleep(10); //每隔十秒循环一次
}

由于编译过程时间较长所以在文件开头加入
ini_set('max_execution_time', '0');
防止请求超时浏览器卡死或失去响应。

PHP调用外部命令有四种方法:exec()、passthru()、system()、shell_exec()。

exec执行系统外部命令时不会输出结果,而是返回结果的最后一行。system在执行系统外部命令时,直接将结果输出到游览器,如果执行命令成功则返回true,否则返回false。

passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。在shell_exec函数可用的情况下你还可以用反撇号eg:echo `ls`来调用外部命令。

安全性说明:当你使用这些函数执行命令时,如果是根据用户提交数据作为执行命令的话,你需要考虑系统安全性,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。

这篇关于PHP串行调用系统命令延时问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758385

相关文章

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co