Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
3
篇与
的结果
2023-08-08
php定时执行任务实现方法详解
php定时执行任务实现方法详解本文章来给大家总结了一些常用的关于在php定时执行任务实现方法详解,包括直接利用php来操作,还有使用操作系统的计划任务来操作,有需要了解的同学可参考。每个PHP脚本都限制了执行时间,所以我们需要通过 set_time_limit 来设置一个脚本的执行时间为无限长;然后使用 flush() 和 ob_flush() 来清除服务器缓冲区,随时输出脚本的返回值。 当我们执行后,每隔5秒钟,我们会得到一行 Hello World代码如下header("Content-Type: text/plain");set_time_limit(0);$infoString = "Hello World" . "n";while( isset($infoString) ){echo $infoString;flush();ob_flush();sleep(5);}例代码如下<?phpignore_user_abort(); // 即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去$interval=20; // 时间间隔 单位 秒$key_file="key.txt"; // 配置文件if (isset($_GET['s'])){if ($_GET['s']=="0"){ // 停止工作,但不退出$s="false";echo "Function is off";}elseif ($_GET['s']=="1"){ // 工作$s="true";echo "Function is on";}elseif ($_GET['s']=="2"){ // 退出$s="die";echo "Function exited";}elsedie("Err 0:stop working 1:working 2:exit");$string = "<?phpn return "".$s."";n?>";write_inc($key_file,$string,true);exit();}if(file_exists($key_file)){do{$mkey = include $key_file;if ($mkey=="true"){ // 如果工作///////////////////// 工作区间 //////////////////////////////////$showtime=date("Y-m-d H:i:s");$fp = fopen('func.txt','a');fwrite($fp,$showtime."n");fclose($fp);///////////////////////////////////////////////////////////////////}elseif ($mkey=="die"){ // 如果退出die("I am dying!");}sleep($interval); // 等待$interval分钟}while(true);}elsedie($key_file." doesn't exist !");function write_inc($path,$strings,$type=false){$path=dirname(__FILE__)."/".$path;if ($type==false)file_put_contents($path,$strings,FILE_APPEND);elsefile_put_contents($path,$strings);}?>个人觉得在php定时执行任务还是有点复杂并且不好使用,下面我来介绍在操作系统中计划任务来实现。在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过。最后不得不综合各门派的方法,才能在我这运行成功。1、写一个PHP程序,命名为test.php,内容如下所示:代码如下<?$fp = fopen("test.txt", "a+");fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!n");fclose($fp);?>程序大胆地写,什么includerequire尽管用,都没问题2、新建Bat文件,命名为test.bat,内容如下所示:代码如下D:phpphp.exe -q D:websitetest.php//相应目录自己改上3、建立WINDOWS计划任务:开始–>控制面板–>任务计划–>添加任务计划浏览文件夹选择上面的bat文件设置时间和密码(登陆WINDOWS的)保存即可了。4、over! 可以右键计划任务点“运行”试试linux系统中我们可以借助Linux的Crontab工具来稳定可靠地触发PHP执行任务。下面介绍Crontab的两种方法。一、在Crontab中使用PHP执行脚本就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本。每一小时执行myscript.php如下:1.代码如下crontab -e2.00 /usr/local/bin/php /home/john/myscript.php/usr/local/bin/php为PHP程序的路径。二、在Crontab中使用URL执行脚本如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。代码如下1.00 lynx -dump /myscript.php下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用"curl -o"选项,你也可以把脚本的输出转储到临时文件。代码如下1./5 * /usr/bin/curl -o temp.txt /myscript.php下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。"-O temp.txt"表示输出会发送到临时文件。代码如下1./10 * /usr/bin/wget -q -O temp.txt /myscript.php
2023年08月08日
22 阅读
0 评论
0 点赞
2023-08-07
crontab+php-cgi/php 定时执行PHP脚本
crontab+php-cgi/php 定时执行PHP脚本说到crontab ,一般是crontab+shell 组合来执行任务,在开发中可能有这类需要:每隔一段时间请求一个php页面。有这样的需求就得用到crontab了,稍微看了php命令行模式,网上搜索了相关资料,整理如下。在web根目录创建请求的脚本index.php 我的文件路径(根据安装路径不同有不同路径):/usr/local/webserver/htdosc/index.php创建crontab文件2.1 crontab -e2.2 * /usr/local/webserver/php/bin/php-cgi -q /usr/local/webserver/htdosc/index.php#编辑crond计划,每分钟请求index.php完成,以上步骤完成后,在我的电脑中能正常每分钟请求index.php注意事项:一. /usr/local/webserver/php/ 是我的php安装路径二. php-cgi 是php解析器(我的理解是这样,总感觉我理解的不对,希望大虾们指正),有些资料是用./bin/php,我电脑上就不能,所以用php-cgi,可能安装的方式不对吧。三. -q 是安静模式(某些资料中看到的)运行php脚本四. 有些资料是 把在index.php的首行添加#! /usr/local/webserver/php/bin/php -q ,并对index.php添加执行权限。我没有这样做,也能正常请求index.php 。方法不一样,道理一样吧!
2023年08月07日
12 阅读
0 评论
0 点赞
2023-08-04
使用 PHP 管理 cron 作业
使用 PHP 管理 cron 作业crontab 或 cron 表是一个 Linux 系统进程/守护进程,有助于调度重复性任务,从而简化我们的日常工作。在本教程中,我们将创建一个动态 PHP 类,它允许我们使用安全连接来操作 crontab。背景:Crontab概述能够安排任务在后台运行真是太棒了!备份 SQL 数据库、获取或发送电子邮件、运行清理任务、分析性能,甚至获取 RSS 源 - cron 作业非常棒!尽管计划新作业的语法乍一看似乎令人生畏,但一旦分解它,就相对容易理解。cron 作业将始终有五列,每列代表一个按时间顺序排列的运算符,后跟要执行的完整路径和命令:home/path/to/command/the_command.sh按时间顺序排列的每个列都与任务计划具有特定的相关性。它们如下:分钟表示给定小时的分钟数,分别为 0-59。小时表示给定一天的小时数,分别为 0-23。天表示给定月份的天数,分别为 1-31。月表示给定年份的月份,分别为 1-12。星期几表示星期几,星期日到星期六,分别在数字上为 0-6。Minutes [0-59]| Hours [0-23]| | Days [1-31]| | | Months [1-12]| | | | Days of the Week [Numeric, 0-6]| | | | |home/path/to/command/the_command.sh因此,例如,如果您想将任务安排在每个月的第一天凌晨 12 点,它看起来像这样:0 0 1 home/path/to/command/the_command.sh另一方面,如果你想安排一个任务在每个星期六上午 8:30 运行,我们会这样写:30 8 6 home/path/to/command/the_command.sh还有许多运算符可用于进一步自定义时间表:逗号用于为任何 cron 列创建逗号分隔的值列表。短划线用于指定值范围。星号用于指定所有或每个值。默认情况下,crontab 会在执行计划任务时发送电子邮件通知。但是,在许多情况下,这是不需要的。我们可以通过将此命令的标准输出重定向到黑洞或设备来轻松抑制此功能。从本质上讲,这是一个文件,它将丢弃写入其中的所有内容。输出重定向通过运算符完成。让我们来看看如何使用我们的示例 cron 作业将标准输出重定向到黑洞,该作业在每个星期六上午 8:30 运行一个计划任务:/dev/null>30 8 6 home/path/to/command/the_command.sh >/dev/null此外,如果我们将标准输出重定向到 null 设备,我们可能还希望重定向标准错误。我们可以通过简单地将标准错误重定向到标准输出已经重定向到已经重定向的位置(空设备)来做到这一点!30 8 6 home/path/to/command/the_command.sh >/dev/null 2>&1使用 PHP 管理 crontab:蓝图为了使用 PHP 管理 crontab,我们需要能够以我们正在编辑其 crontab 的用户的身份在远程服务器上执行命令。虽然您可以使用 PHP 提供的 SSH2 库,但我们将使用 phpseclib 库,它支持不同的协议与远程服务器进行通信。如何安装和使用 phpseclib 库phpseclib库(PHP Secure Communications Library)是一个PHP库,它为SSH,SFTP和SSL / TLS等安全通信协议提供了一组方法和类。它使我们能够将安全通信功能整合到我们的应用程序中,而无需依赖外部命令行工具或扩展。如果你想知道为什么你更喜欢使用 phpseclib 而不是 PHP 提供的核心 SSH2 函数,让我们来看看 phpseclib 库的好处:SSH2 库提供的功能有限,可能不支持所有 SSH 功能提供抽象,使您可以轻松地在不同协议之间切换抽象底层协议的复杂性易于使用且直观它不需要任何外部依赖项或扩展支持多种安全通信协议,包括 SSH、SFTP、SCP、FTPS、SSL/TLS 等有据可查、积极开发和社区支持如您所见,phpseclib 库可以为安全通信需求提供更全面、更强大的解决方案。让我们看看如何安装它。您可以使用 composer 安装 phpseclib 库,如以下代码片段所示。$composer install phpseclib/phpseclib安装后,您可以通过在 PHP 脚本顶部包含自动加载器脚本来开始在 PHP 代码中使用 phpseclib 库,如以下代码片段所示。<?phprequire 'vendor/autoload.php';让我们快速浏览一下如何进行远程SSH2登录。<?phprequire 'vendor/autoload.php';use phpseclib3\Net\SSH2;$ssh = new SSH2('example.remote-server.com');if (!$ssh->login('ssh-username', 'ssh-password')) {die('Login to remote server failed.');}以上是对 phpseclib 库的简要介绍。类模板Ssh2_crontab_manager在本节中,我们将讨论需要在类中实现哪些方法。我们的类必须能够以适当的用户身份进行连接和身份验证,以便执行命令并访问用户的 crontab。因此,我们将建立一个 SSH2 连接并在构造函数本身中对其进行身份验证。有了经过身份验证的连接,我们需要一种方法来处理我们将运行的各种命令的执行。我们将使用 phpseclib 库提供的方法。通常,当我们需要在远程服务器上执行命令时,我们将从类的其他方法中调用此方法。exec()接下来,我们需要能够将 crontab 写入文件,以便我们可以切实地访问它。我们还需要一种方法在完成此文件后将其删除。我们将定义将 crontab 输出到文件的方法定义为 ,并将删除此文件的方法定义为 。write_to_file()remove_file()当然,我们还需要一种方法来创建和删除 cron 作业。因此,我们将分别定义和方法。append_cronjob()remove_cronjob()如果我们删除了唯一或最后一个 cron 作业,我们应该可以选择删除整个 crontab,而不是尝试创建一个空的 crontab。为了处理这种情况,我们可以使用该方法。remove_crontab()最后,我们将为类创建两个帮助程序方法。这些方法中的第一个将返回一个布尔值,它将简单地检查临时 cron 文件是否存在。后者将用于在发生错误时显示错误消息。我们将分别命名这些方法。crontab_file_exists()error_message()我们的准系统PHP类应该看起来像这样:<?phpuse phpseclib3\Net\SSH2;Class Ssh2_crontab_manager {private $connection; private $path; private $handle; private $cron_file; public function __construct() {...} public function exec() {...} public function write_to_file() {...} public function remove_file() {...} public function append_cronjob() {...} public function remove_cronjob() {...} public function remove_crontab() {...} private function crontab_file_exists() {...} private function error_message() {...}}?>实现类Ssh2_crontab_manager在本节中,我们将实现类的各种方法。构造函数类构造函数将主要负责建立和验证 SSH2 连接。让我们看一下方法。__constructpublic function __construct($host = null, $port = null, $username = null, $password = null){$path_length = strrpos(__FILE__, "/"); $this->path = substr(__FILE__, 0, $path_length) . '/'; $this->handle = 'crontab.txt'; $this->cron_file = "{$this->path}{$this->handle}"; try { if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) { throw new Exception("Please specify the host, port, username, and password!"); } $this->connection = new SSH2($host, $port); if (!$this->connection->login($username, $password)) { throw new Exception("Could not authenticate '{$username}' using password: '{$password}'."); } } catch (Exception $e) { $this->error_message($e->getMessage()); }}首先,它需要四个参数,每个参数的默认值为:NULL$host:表示我们要连接的远程服务器的 IP 地址。$port:用于 SSH2 连接的端口。$username:表示服务器的用户的登录名。$password:表示用户对服务器的密码。首先,它计算当前文件的路径并将其设置为变量。它还设置要使用的 cron 文件的名称,并在 中构造 cron 文件的完整路径。$this->path$this->handle$this->cron_file然后,我们检查是否缺少任何必需的参数,如果是,它会抛出带有相应错误消息的异常。接下来,它通过传入 and 值来创建类的实例以建立 SSH 连接。SSH2$host$port最后,它尝试使用提供的 和 通过调用 SSH2 连接对象的方法进行身份验证。如果身份验证成功,则建立连接。如果失败,将引发异常。$username$passwordlogin()方法exec该方法负责在远程服务器上执行命令。这相当于手动将命令输入到像PuTTY这样的shell中。为了提供更大的灵活性,我们将公开此方法,以便用户可以实际执行他们可能需要运行的任何其他命令。exec让我们看一下方法。execpublic function exec(){$argument_count = func_num_args(); try { if (!$argument_count) { throw new Exception("There is nothing to execute, no arguments specified."); } $arguments = func_get_args(); $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0]; $stream = $this->connection->exec($command_string); if (!$stream) { throw new Exception("Unable to execute the specified commands: <br />{$command_string}"); } } catch (Exception $e) { $this->error_message($e->getMessage()); } return $this;}我们的方法使用 phpseclib 库的方法执行命令。exec()exec在此方法中,我们要做的第一件事是定义一个变量,表示传递的参数总数的计数。我们将使用 PHP 的函数来获取此计数。接下来,在 try 块中,我们将检查是否将任何参数传递给此方法。如果参数计数为 0,我们将抛出带有相应消息的新异常。func_num_args()接下来,使用该函数,我们将创建一个包含传递给此方法的所有参数的数组。然后,使用三元运算符,我们将定义一个新变量 ,作为我们将要执行的实际 Linux 命令的单行字符串表示形式。func_get_args()$command_string如果我们确实有多个命令要执行,我们将使用 PHP 的函数将参数数组解析为字符串。我们将两个参数传递给:胶水或分隔符,它基本上只是一个将插入数组元素之间的字符串,以及数组本身。我们将使用 Linux 运算符分隔每个元素,这允许我们在一行上按顺序执行多个命令!implode()implode()&&准备好命令并将其解析为字符串后,我们现在可以尝试使用 SSH2 类中的方法通过已建立的 SSH 连接执行命令字符串。返回值存储在变量中。exec()$stream方法write_to_file下一个方法 , 将负责将现有 crontab 写入临时文件,或者在不存在 cron 作业时创建一个空白的临时文件。这将需要两个参数:write_to_file()我们将创建的临时文件的路径创建时应该使用的名称该方法应如下所示。write_to_filepublic function write_to_file($path=NULL, $handle=NULL){if (! $this->crontab_file_exists()) { $this->handle = (is_null($handle)) ? $this->handle : $handle; $this->path = (is_null($path)) ? $this->path : $path; $this->cron_file = "{$this->path}{$this->handle}"; $init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}"; $this->exec($init_cron); } return $this;}首先,我们使用布尔方法检查 cron 文件是否已存在,我们稍后将创建该方法。如果文件存在,则无需继续。如果没有,我们将使用三元运算符来检查 和 props 以确定它们是否是 .如果它们中的任何一个是 ,我们将使用构造函数中的预定义回退来定义它们。crontab_file_exists()$path$handleNULLNULL然后,我们将这些属性连接成一个新属性,该属性表示临时 cron 文件的完整路径和文件名。接下来,我们使用带有参数的 Linux 命令将用户 crontab 显示为标准输出。然后,使用 Linux 的运算符,我们将标准输出或我们的临时 cron 文件重定向到我们的临时 cron 文件,方法是连接到命令字符串!使用运算符将输出重定向到文件将始终创建该文件(如果该文件不存在)。crontab-l>STDOUT$this->cron_file>这很好用,但前提是 crontab 中已经安排了作业。如果没有 cron 作业,则永远不会创建此文件!但是,使用运算符,我们可以将其他命令/表达式附加到此字符串中。因此,让我们附加一个条件表达式来检查 cron 文件是否存在。如果该文件不存在,则此表达式的计算结果将为 false。因此,如果需要,我们可以在此条件之后使用 or 运算符创建一个新的空白文件。&&||or如果条件计算结果为 false,则在之后放置的命令将执行。现在,通过再次使用运算符,这次没有在它前面加上特定的命令,我们可以创建一个新的空白文件。因此,从本质上讲,这串命令会将 crontab 输出到一个文件中,然后检查该文件是否存在,这将指示 crontab 中有条目,然后创建一个新的空白文件(如果它尚不存在)。or>最后,我们调用了该方法并将命令字符串作为唯一的参数传递给它。然后,为了使此方法也可链接,我们将返回 .exec()$this方法remove_file让我们快速看一下该方法。remove_filepublic function remove_file(){if ($this->crontab_file_exists()) $this->exec("rm {$this->cron_file}"); return $this;}在此方法中,我们使用辅助方法 , 来检查临时 cron 文件是否存在,然后执行 Linux 命令将其删除(如果存在)。像往常一样,我们还将返回以保持链条可伸缩性。crontab_file_exists()rm$this方法append_cronjob该方法通过将新的作业/行添加到临时 cron 文件,然后在该文件上执行命令来创建新的 cron 作业,这会将所有这些作业安装为新的 crontab。append_cronjobcrontab它看起来像这样:public function append_cronjob($cron_jobs=NULL){if (is_null($cron_jobs)) $this->error_message("Nothing to append! Please specify a cron job or an array of cron jobs."); $append_cronfile = "echo '"; $append_cronfile .= (is_array($cron_jobs)) ? implode("\n", $cron_jobs) : $cron_jobs; $append_cronfile .= "' >> {$this->cron_file}"; $install_cron = "crontab {$this->cron_file}"; $this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file(); return $this;}该方法接受一个参数,该参数将是一个字符串或表示要追加的 cron 作业的字符串数组。append_cronjob()$cron_jobs我们将通过确定参数是否为 .如果是,我们将调用该方法以停止任何进一步的执行,并向用户显示错误消息。$cron_jobsNULLerror_message()接下来,我们将一个新变量 定义为字符串,文本后跟空格,末尾带有单引号。我们将暂时用我们正在添加的各种 cron 作业以及结束引号填充此字符串。我们将使用字符串连接运算符构建此字符串。$append_cronfileecho.=接下来,使用三元运算符,我们确定是否是数组。如果是,我们将用换行符内爆该数组,以便每个 cron 作业都写在 cron 文件中自己的行上。如果参数不是数组,我们将简单地将该作业连接到字符串上,而无需任何特殊处理。$cron_jobs\n$cron_jobs$append_cron本质上,我们可以通过再次将标准输出重定向到文件中来将我们的任务回显到 cron 文件中。因此,通过使用字符串连接运算符,我们将右单引号附加到命令字符串,以及 Linux 运算符,后跟 cron 文件的完整路径和文件名。与始终覆盖文件的运算符不同,运算符将输出追加到文件末尾。因此,通过使用此运算符,我们不会覆盖任何现有的 cron 作业。>>>>>接下来,我们将一个变量定义为字符串,使用我们将用于安装我们将要创建的新 cron 文件的命令。这就像调用 crontab 命令一样简单,后跟 cron 文件的路径和文件名。最后,在通过该方法执行这些命令之前,我们将首先调用该方法来创建临时 cron 文件。然后,在链中,我们将执行这些命令并调用该方法删除临时文件。最后,我们将返回,以便该方法可链接。exec()write_to_file()remove_file()$thisappend_cronjob()方法remove_cronjob现在我们可以创建新的 cron 作业,我们也有能力删除它们是合乎逻辑的!这就是该方法的目的。remove_cronjob一起来看看吧。public function remove_cronjob($cron_jobs=NULL){if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); $original_count = count($cron_array); if (is_array($cron_jobs)) { foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); } else { $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT); } return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array);}它需要一个参数,这将是一个(简单的)正则表达式。它将用于在 crontab 中查找匹配的作业并相应地删除它们。创建 cron 文件后,我们现在将使用 PHP 的函数将其读入数组。此函数会将给定文件解析为数组,每行都作为数组元素。我们将 cron 文件作为第一个参数传递给此函数,然后设置一个特殊标志,这将强制忽略所有新行。因此,我们有一个只有 cron 作业本身的数组。如果没有计划任何 cron 作业,则此数组将为空。随后,将没有理由继续。因此,我们已经检查了 是否为空,如果是,则停止执行。file()FILE_IGNORE_NEW_LINESfile()$cron_array现在,我们确定参数是否是数组。如果它是一个数组,我们用循环遍历它。在该循环中,我们执行一个 函数 .这个漂亮的函数,与 不同,将返回与指定的正则表达式匹配的所有数组元素的数组。但是,在这种情况下,我们需要不匹配的数组元素。换句话说,我们需要一个包含我们将要保留的所有 cron 作业的数组,以便我们可以只使用这些作业初始化 crontab。因此,我们将在这里设置一个特殊的标志,这将导致返回一个与正则表达式不匹配的所有元素的数组。因此,我们将拥有一系列我们想要保留的所有 cron 作业。$cron_jobsforeachpreg_grep()preg_match()PREG_GREP_INVERTpreg_grep()如果参数不是数组,我们将以相同的方式进行,但没有任何迭代。同样,我们将重新定义为设置了标志的函数的结果数组。$cron_jobs$cron_arraypreg_grep()PREG_GREP_INVERT使用我们的集合,现在我们将该数组的当前长度与其原始长度进行比较,我们将其缓存在变量中。如果长度相同,我们将简单地返回删除临时 cron 文件的方法。如果它们不匹配,我们将删除现有的 crontab,然后安装新的。$cron_array$original_countremove_file()方法remove_crontab删除整个 crontab 相对容易实现,如以下代码片段所示。public function remove_crontab(){$this->exec("crontab -r")->remove_file(); return $this;}其他帮助程序方法在编写了首当其冲的 cron 管理类之后,我们现在将看看我们在整个课程中使用的两个小而有用的方法,以及 .crontab_file_exists()error_message()crontab_file_exists法此方法返回 PHP 方法的结果,或者 ,具体取决于临时 cron 文件是否存在。file_exists()truefalseprivate function crontab_file_exists(){return file_exists($this->cron_file);}error_message法此方法采用单个参数(一个字符串)表示我们要显示的错误消息。然后,我们将调用 PHP 的方法停止执行并显示此消息。字符串本身将连接成一个应用简单样式的元素。die()private function error_message($error){die("<pre style='color:#EE2711'>ERROR: {$error}</pre>");}完整的类如下所示:<?phpuse phpseclib3\Net\SSH2;Class Ssh2_crontab_manager {private $connection; private $path; private $handle; private $cron_file; public function __construct($host = null, $port = null, $username = null, $password = null) { $path_length = strrpos(__FILE__, "/"); $this->path = substr(__FILE__, 0, $path_length) . '/'; $this->handle = 'crontab.txt'; $this->cron_file = "{$this->path}{$this->handle}"; try { if (is_null($host) || is_null($port) || is_null($username) || is_null($password)) { throw new Exception("Please specify the host, port, username, and password!"); } $this->connection = new SSH2($host, $port); if (!$this->connection->login($username, $password)) { throw new Exception("Could not authenticate '{$username}' using password: '{$password}'."); } } catch (Exception $e) { $this->error_message($e->getMessage()); } } public function exec() { $argument_count = func_num_args(); try { if (!$argument_count) { throw new Exception("There is nothing to execute, no arguments specified."); } $arguments = func_get_args(); $command_string = ($argument_count > 1) ? implode(" && ", $arguments) : $arguments[0]; $stream = $this->connection->exec($command_string); if (!$stream) { throw new Exception("Unable to execute the specified commands: <br />{$command_string}"); } } catch (Exception $e) { $this->error_message($e->getMessage()); } return $this; } public function write_to_file($path=NULL, $handle=NULL) { if (! $this->crontab_file_exists()) { $this->handle = (is_null($handle)) ? $this->handle : $handle; $this->path = (is_null($path)) ? $this->path : $path; $this->cron_file = "{$this->path}{$this->handle}"; $init_cron = "crontab -l > {$this->cron_file} && [ -f {$this->cron_file} ] || > {$this->cron_file}"; $this->exec($init_cron); } return $this; } public function remove_file() { if ($this->crontab_file_exists()) $this->exec("rm {$this->cron_file}"); return $this; } public function append_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to append! Please specify a cron job or an array of cron jobs."); $append_cronfile = "echo '"; $append_cronfile .= (is_array($cron_jobs)) ? implode("\n", $cron_jobs) : $cron_jobs; $append_cronfile .= "' >> {$this->cron_file}"; $install_cron = "crontab {$this->cron_file}"; $this->write_to_file()->exec($append_cronfile, $install_cron)->remove_file(); return $this; } public function remove_cronjob($cron_jobs=NULL) { if (is_null($cron_jobs)) $this->error_message("Nothing to remove! Please specify a cron job or an array of cron jobs."); $this->write_to_file(); $cron_array = file($this->cron_file, FILE_IGNORE_NEW_LINES); if (empty($cron_array)) $this->error_message("Nothing to remove! The cronTab is already empty."); $original_count = count($cron_array); if (is_array($cron_jobs)) { foreach ($cron_jobs as $cron_regex) $cron_array = preg_grep($cron_regex, $cron_array, PREG_GREP_INVERT); } else { $cron_array = preg_grep($cron_jobs, $cron_array, PREG_GREP_INVERT); } return ($original_count === count($cron_array)) ? $this->remove_file() : $this->remove_crontab()->append_cronjob($cron_array); } public function remove_crontab() { $this->exec("crontab -r")->remove_file(); return $this; } private function crontab_file_exists() { return file_exists($this->cron_file); } private function error_message($error) { die("<pre style='color:#EE2711'>ERROR: {$error}</pre>"); }}?>Putting It All TogetherNow that we've completed our cron management class, let's take a look at a few examples of how to use it.Instantiating the Class and Establishing an Authenticated ConnectionFirstly, let's create a new instance of our class. Remember, we'll need to pass the IP address, port, username, and password to the class constructor.<?phprequire 'vendor/autoload.php';include "./ssh2_crontab_manager.php";$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');Appending a Single Cron JobWith an authenticated connection in place, let's have a look at how we can create a new, single, cron job.<?phprequire 'vendor/autoload.php';include "./ssh2_crontab_manager.php";$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');$crontab->append_cronjob('30 8 6 home/path/to/command/the_command.sh >/dev/null 2>&1');Appending an Array of Cron JobsAppending multiple cron jobs is just as easy as appending a single cron job. We'll simply pass an array to the method.append_cronjob()<?phprequire 'vendor/autoload.php';include "./ssh2_crontab_manager.php";$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');$new_cronjobs = array('0 0 1 * * home/path/to/command/the_command.sh', '30 8 * * 6 home/path/to/command/the_command.sh >/dev/null 2>&1');$crontab->append_cronjob($new_cronjobs);Removing a Single Cron Job与创建单个 cron 作业的方式类似,我们现在将删除一个。但是,这一次,我们将使用正则表达式来查找适当的任务。此正则表达式可以像您需要的那样简单或复杂。实际上,有许多方法可以为您正在寻找的任务进行正则表达式。例如,如果您需要删除的任务是唯一的,因为正在运行的命令未在 crontab 中的其他任何地方使用,则只需将命令名称指定为正则表达式即可。此外,如果要删除某个月的所有任务,只需编写一个正则表达式即可查找给定月份所有作业的匹配项。<?phprequire 'vendor/autoload.php';include "./ssh2_crontab_manager.php";$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');$cron_regex = '/home/path/to/command/the_command.sh/';$crontab->remove_cronjob($cron_regex);删除 cron 作业数组删除多个 cronjob 的处理方式与删除单个 cronjob 的方式相同,但有一个例外:我们将一个 cron job 正则表达式数组传递给该方法。remove_cronjob()<?phprequire 'vendor/autoload.php';include "./ssh2_crontab_manager.php";$crontab = new Ssh2_crontab_manager('11.11.111.111', '22', 'my_username', 'my_password');$cron_regex = array('/0 0 1 \* \*/', '/home\/path\/to\/command\/the_command\.sh\/');$crontab->remove_cronjob($cron_regex);
2023年08月04日
18 阅读
0 评论
0 点赞