日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

PHP 毫秒级定时器,实现php毫秒定时器方法详解

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP 毫秒级定时器,实现php毫秒定时器方法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

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毫秒定时器方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。