描述

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

PHP能实现的功能

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

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

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

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

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

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

实现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

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

打开APP精彩内容

点击阅读全文

PHP 毫秒级定时器,实现php毫秒定时器方法详解相关推荐

  1. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  2. java定时执行bat_windows定时器配置执行java jar文件的方法详解

    ##创建测试类 新建Java工程创建测试类如下代码:(创建文件验证定时器是否执行) package makeFile; import java.io.File; import java.io.IOEx ...

  3. Unified Functional Testing(UFT)15.0.2入门保姆级教程(一),图文详解。QTP

    UFT入门之侦测器(ObjectSpy)及录制第一个脚本 实验说明 1.Quick Test Pro(QTP)11.5后更名为Unified Functional Testing(UFT) 2. 实验 ...

  4. 计算机游戏 25攻略,我的咖啡厅25级攻略大全及游戏技巧详解

    我的咖啡厅这款游戏相信大家都听说过了.游戏里面的体验非常的好.很真实,有一种身临其境的感觉.今天小编给大家带来的就是我的咖啡厅25级攻略大全,希望对大家有所帮助. 首先,先进入房间 ,上二楼 ,查看窗 ...

  5. vue 子级拿值_vue 父组件通过$refs获取子组件的值和方法详解

    前言 在vue项目中组件之间的通讯是很常见的问题,同时也是很重要的问题,我们大致可以将其分为三种情况: 父传子:在父组件中绑定值,在子组件中用props接收 子传父:在父组件中监听一个事件,在子组件中 ...

  6. 爬虫神级解析工具之XPath:用法详解及实战

    一.XPATH是什么 Xpath最初被设计用来搜寻XML文档,但它同样适用于HTML文档的搜索.通过简洁明了的路径选择表达式,它提供了强大的选择功能:同时得益于其内置的丰富的函数,它可以匹配和处理字符 ...

  7. 保姆级 Git 入门教程,10000 字详解

    转载来自:杰哥的IT之旅 前言 Git简介 实用主义 深入探索 总结 参考资料 Git简介 Git 是一种分布式版本控制系统,它可以不受网络连接的限制,加上其它众多优点,目前已经成为程序开发人员做项目 ...

  8. SD-RTN——毫秒级网络加速带来全新的体验

    近几年网络直播视频.VR/AR.竞技游戏.大数据.4K高清视频的快速增长,正在将毫秒级网络加速技术推向历史发展的潮头.用户的预期越来越高,他们期待"最好"的在线体验,网络延迟会直接 ...

  9. Timer定时器详解

    Timer定时器主要做定时任务或者按照一定的时间间隔做任务,例如每天4点钟定时执行作业等 Timer的特性 1.它属于单线程的,每创建个Timer实例,就会创建一个新线程 2.Timer默认情况下不是 ...

最新文章

  1. spring boot集成mybatis
  2. [BZOJ5303] [HAOI2018] 反色游戏
  3. Bzoj1051 受欢迎的牛
  4. python右斜杠_Python中的左斜杠、右斜杠(正斜杠和反斜杠)
  5. Verilog语言实现并行(循环冗余码)CRC校验
  6. lisp正负调换_lisp中如何把符号转换为字符串
  7. 点云平面提取_基于LiDAR点云数据滤波方法
  8. Thinkphp3.2整合微信支付
  9. iptables官方文档
  10. 关于一些信息学数论问题例题的讨论
  11. SQL2008 行锁使用RowLock
  12. android不是16位,16位图像和Android处理
  13. JS动态加载JSON文件并读取数据
  14. qt.qpa.xcb: could not connect to display解决
  15. 哈佛幸福课个人使用精华
  16. C++计算某天是该年的第几天
  17. ASP.NET类计算机专业毕业设计题目选题课题
  18. 如何为IT部门制定更好的战略计划
  19. AlertManager告警的单独使用及prometheus配置告警规则使用
  20. 如何识别媒体偏见_超越偏见:为什么我们不能仅仅“修正”面部识别

热门文章

  1. 个性化排序的神经协同过滤
  2. 分布式深度学习DDL解析
  3. Java/Android 调用类里面的方法
  4. App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VIEW int
  5. JDBC学习DayTwo
  6. CSS3---6.文字阴影
  7. 集群分发脚本xsync
  8. 2022-2028年中国消防报警行业市场前瞻与投资战略规划分析报告
  9. Linux下安装数据库
  10. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...