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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec