热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php毫秒函数,实现php毫秒定时器方法详解

PHP编程语言是一种快速、简洁的服务端脚本编程语言,可以制作强大的交互性展现。在编程界PHP是完全免费的语言,在程序员身上使用非常的广泛,

PHP编程语言是一种快速、简洁的服务端脚本编程语言,可以制作强大的交互性展现。在编程界PHP是完全免费的语言,在程序员身上使用非常的广泛,在编程中是大家高效的选择。

PHP能实现的功能

1.可以快速的生成动态网站页面内容,方便快捷。

2.可以在网站端实现对服务器上的文件管理,例如对文件的:创建、打开、读取、写入、关闭。

3.手机html中的表单数据,实现交互性。

4.方便、简单的可以发送和接收 COOKIEs数据。

5.链接MySQL数据库之后,可以对数据库的数据进行可以对数据库中的数据,进行增、删、查、改等功能

6.方便的对隐私数据进行加密,限制某些用户访问网站上的资源。

5df51485fe27130d2ce4fbaf5c51c72b.png

实现php毫秒定时器

PHP 小程序,功能为每30秒记录时间,写入到文件

代码如下

# vi for_ever.php

#! /usr/local/php/bin/php

define(‘ROOT’, dirname(__FILE__)。‘/’);

set_TIme_limit(0);

while (true) {

file_put_contents(ROOT.‘for_ever.txt’, date(‘Y-m-d H:i:s’)。“\n”, FILE_APPEND);

echo date(‘Y-m-d H:i:s’), ‘ OK!’;

sleep(30);

}

?>

保存退出,然后赋予 for_ever.php 文件可执行权限:

# chmod +x for_ever.php

让它在再后台执行:

# nohup /home/andy/for_ever.php.php &

记得最后加上 & 符号,这样才能够跑到后台去运行

执行上述命令后出现如下提示:

[1] 5157

nohup: appending output to ‘nohup.out’

所有命令执行输出信息都会放到 nohup.out 文件中

这时你可以打开 for_ever.php 同目录下的 for_ever.txt 和 nohup.out 看看效果!

好了,它会永远运行下去了,怎么结束它呢?

# ps

PID TTY TIME CMD

4247 pts/1 00:00:00 bash

5157 pts/1 00:00:00 for_ever.php

5265 pts/1 00:00:00 ps

# kill -9 5157

找到进程号 5157 杀之,你将看到

[1]+ Killed nohup /home/andy/for_ever.php

OK!

=========================================================================

在很多项目中,或许有很多类似的后端脚本需要通过crontab定时执行。比如每10秒检查一下用户状态。脚本如下:

@file: /php_scripts/scan_userstatus.php

代码如下:

#!/usr/bin/env php -q

$status = has_goaway();

if ($status) {

//done

}

?>

通过crontab定时执行脚本scan_userstatus.php

#echo “*:*/10 * * * * /php_scripts/scan_userstatus.php”

这样,每隔10秒钟,就会执行该脚本。

我们发现,在短时间内,该脚本的内存资源还没有释放完,又启用了新的脚本。也就是说:新脚本启动了,旧脚本占用的资源还没有如愿释放。如此,日积月累,浪费了很多内存资源。我们对这个脚本进行了一下改进,改进后如下:

@file: /php_scripts/scan_userstatus.php

代码如下:

#/usr/bin/env php -q

while (1) {

$status = has_goaway();

if ($status) {

//done

}

usleep(10000000);

}

?>

这样,不需要crontab了。可以通过以下命令执行脚本,达到相同的功能效果

#chmod +x /php_scripts/scan_userstatus.php

#nohup /php_scripts/scan_userstatus.php &

在这里,我们通过&将脚本放到后台运行,为了防止随着终端会话窗口关闭进程被杀,我们使用了nohup命令。那么有没有办法,不使nohup命令,也能够运行呢,就像Unin/Linux Daemon一样。接下来,就是我们要讲的守护进程函数。

什么是守护进程?一个守护进程通常补认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork() 详细如下:

@file: /php_scripts/scan_userstatus.php

代码如下:

#/usr/bin/env php -q

daemonize();

while (1) {

$status = has_goaway();

if ($status) {

//done

}

usleep(10000000);

}

funcTIon daemonize() {

$pid = pcntl_fork();

if ($pid === -1 ) {

return FALSE;

} else if ($pid) {

usleep(500);

exit(); //exit parent

}

chdir(“/”);

umask(0);

$sid = posix_setsid();

if (!$sid) {

return FALSE;

}

$pid = pcntl_fork();

if ($pid === -1) {

return FALSE;

} else if ($pid) {

usleep(500);

exit(0);

}

if (defined(‘STDIN’)) {

fclose(STDIN);

}

if (defined(‘STDOUT’)){

fclose(STDOUT);

}

if (defined(‘STDERR’)) {

fclose(STDERR);

}

}

?>

实现了守护进程函数以后,则可以建立一个常驻进程,所以只需要执行一次:

#/php_scripts/scan_userstatus.php

这里较为关键的二个php函数是pcntl_fork()和posix_setsid()。fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动他的进程与终端控制等,也意味着父进程可以自由退出。 pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,而返进程ID号,则表示在父进程中。在这里,退出父进程。setsid(),它首先使新进程成为一个新会话的“领导者”,最后使该进程不再控制终端,这也是成为守护进程最关键的一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端。(在直接打开一个终端设备,而且没有使用O_NOCTTY标志的情况下, 会获得控制终端)。

其它事项说明:

1) chdir() 将守护进程放到总是存在的目录中,另外一个好处是,你的常驻进程不会限制你umount一个文件系统。

2)umask() 设置文件模式,创建掩码到最大的允许限度。如果一个守护进程需要创建具有可读,可写权限的文件,一个被继承的具有更严格权限的掩码会有反作用。

3)fclose(STDIN), fclose(STDOUT), fclose(STDERR) 关闭标准I/O流。注意,如果有输出(echo),则守护进程会失败。所以通常将STDIN, STDOUT, STDERR重定向某个指定文件。

====================================

#!/bin/bash

PHP=/opt/php/bin/php

CMD_DIR=/data/yii2-angularjs

cd $CMD_DIR

while :; do

$PHP yii user/add-user

echo “$PHP yii user/add-user”

sleep 1

done

done

done

====================================



推荐阅读
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • PHP混淆代码的破解与理解
    本文探讨了PHP中常见的代码混淆技术及其破解方法,包括简单的变量名混淆和更复杂的加密技术。 ... [详细]
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 使用Echarts for Weixin 小程序实现中国地图及区域点击事件
    本文介绍了如何使用Echarts for Weixin在微信小程序中构建中国地图,并实现区域点击事件。包括效果展示、条件准备和逻辑实现的具体步骤。 ... [详细]
  • 在开发板的启动选项中看到如下两行:7:LoadBootLoadercodethenwritetoFlashviaSerial.9:LoadBootLoadercodethenwri ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 本文介绍了一种利用PHP cURL库高效提取Sohu邮箱联系人列表的方法。通过设置错误报告级别、定义Cookie文件路径等关键步骤,确保了代码的稳定性和可靠性。经过实际测试,该方法在2012年3月24日被验证为有效,能够快速准确地获取联系人信息。此外,文章还提供了详细的代码示例和注意事项,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • vsftpd配置(虚拟用户、匿名用户登录)
    一、ftp服务搭建(一)概述1.ftp连接及传输模式(1)控制连接TCP21,用于发送FTP命令信息 ... [详细]
author-avatar
云天河马
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有