PHP は pcntl と libevent を使用してタイマー関数を実装します_PHP チュートリアル
PHP は、pcntl と libevent を使用してタイマー関数を実装します。まず、pcntl (PHP スレッド) の例を見てみましょう。
function newChild($func_name) {
echo "enter newChildn"
$args = func_get_args(); args[0] );
$pid = pcntl_fork();
if ($pid == 0) {
function_exists($func_name) および exit(call_user_func_array($func_name, $args)) または exit(-1); } else if( $pid == -1) {
csl、興味があれば参加できますで議論してください)
function on_timer() {
echo "タイマーが呼び出されました";
}
/**
* @param $func 文字列、関数名
* @param $timeouts int、時間遅延の microtimes
*/
function timer($func, $timeouts){
echo "タイマーを入力"
$base =event_base_new()
$event =event_new();
event_set($event, EV_TIMEOUT, $func);
event_base_set($event, $timeouts);
$ pid = newChild("タイマー", "on_timer", 5000000);
if ( $pid > 0 ) {
echo "マスタープロセス終了"
}
PHP は、pcntl を拡張して「マルチスレッド」を実装します (プロセス)
pcntl とticks
ticks を、declare(ticks = n) {statement} によって実装します。 语法定义的 , declare 语法目前只能接受 ticks, 他定义的 ticks = n 的意义是当 declare 指定的语句块中执行了 N 条低级语句去发生一个事件 , 这个事件可以通过 register_tick_function($function_name) 来注册 .
pcntl 的信号机制是基于 ticks 机制实现的 . 因此 , 我们使用 pcntl 族函数中信号相关的函数时 , 需要在前面增加 declare(ticks = n) 语法结构 .
int pcntl_alarm(int $seconds):
$seconds 秒后向进程发送一个 SIGALRM 信号 , 每次调用 pcntl_alarm 方法都会取消之前设置的时钟 .
void pcntl_exec(string $path[, array $args[, array $env]]):
在当前进程空间执行一个程序 .
$path: 必须是二进制可执行文件 , 或具有有效脚本头信息 (#!/usr/local/bin/php) 的脚本文件路径 .
$args: 将要传递给该程序的字符串参数列表 ( 数组形式 )
$envs: 环境变量 . 以数组 (key => value 形式 ) 方式传递给要执行程序的环境变量 .
int pcntl_for k (void):
创建一个子进程 , 该子进程与父进程仅仅是 PID( 进程号 ) 和 PPID( 父进程号 ) 不同 .
在父线程执行时返回创建的子进程 pid, 在子线程执行时返回 0, 创建子进程失败时会在父进程上下文返回 -1, 并引发 php 错误 .
理解这里的 fork 需要知道 : pcntl_fork 创建的是一个分支节点 , 相当于一个标记 , 父进程完成后 , 子进程会从标记处继续执行 , 也就是说 pcntl_fork 后面的代码分别被父进程和子进程执行了两遍 , 而两个进程在执行过程中得到的返回值是不同的 . 因此 , 才可以分离父子进程执行不同的代码 .
int pcntl_getpriority([int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]):
获取给定 $pid 对应的进程的优先级 , 默认是通过 getmypid() 获取到的值也就是当前进程 .
$pid: 如果没有指定 , 默认是当前进程 .
$process_identifier: PRIO_PGRP, PRIO_USER, PRIO_PROCESS 三者之一 , 默认 PRIO_PROCESS. 其中 PRIO_PGRP 指获取进程组的优先级 , PRIO_USER 指获取用户进程的优先级 , PRIO_PROCESS 指获取特定进程优先级 .
返回进程的优先级 , 或者在发生错误时返回 false, 值越小说明越优先
bool pcntl_setpriority(int $priority[, int $pid = getmypid()[, int $process_identifier = PRIO_PROCESS]]:
设置进程的优先级 .
$priority: 优先级值 , -20 到 20 的范围内 , 默认优先级为 0. 值越小说明越优先 .
$pid: 如果没有指定 , 指当前进程
$process_identifier: 意义同 pcntl_getpriority 的 $process_identifier.
设置成功返回 TRUE, 失败返回 FALSE.
bool pcntl_signal_dispatch(void):
调用通过 pcntl_signal() 安装的即将发生的信号的处理器 .
调用成功返回 TRUE, 失败返回 false.
php 5.3.3 加入
bool pcntl_signal(int $signo, callback $handler[, bool $restart_syscalls = true]):
为指定的信号 $signo 安装一个新的信号处理器 $handler.
最后一个参数不明白意义 .
bool pcntl_sigprocmask(int $how, array $set[, array &$oldset]):
增加 , 删除或设置锁信号 , 具体的行为依赖于 $how 参数
$how: SIG_BLOCK 用于把信号增加到当前锁信号中 , SIG_UNBLOCK 用于把信号从当前锁信号中移除 , SIG_SETMASK 用于用给定的信号列表替换当前锁信号 .
$set: 要增加 , 移除或设置的信号列表 .
$oldset: 用于向调用者返回旧的锁定信号 .
成功返回 TRUE, 失败返回 FALSE.
int pcntl_sigtimedwait(array $set[, array &$siginfo[, int $seconds = 0[, int $nanoseconds = 0]]]):
pcntl_sigtimedwait 实际上和 pcntl_sigwaitinfo() 所做的是同样的事情 , 不过 pcntl_sigtimedwait 多了两个增强的参数 $seconds 和 $nanoseconds, 这样就允许脚本的停留时间有一个上限而不是无限制等待 .
$set: 需要等待的信号列表
$siginfo: 用来向调用者返回等待得到的信号的信息 , 信息内容见 pcntl_sigwaitinfo
$seconds: 超时的秒数
$nanoseconds: 超时的纳秒数
成功后 , pcntl_sigtimedwiat() 返回信号编号
int pcntl_sigwaitinfo(array $set[, array &$siginfo]):
挂起当前脚本的执行 , 直到接受到 $set 中的某个信号 , 如果其中的一个信号将要到达 ( 比如被 pcntl_sigprocmask 锁定 ) 那么 pcntl_sigwaitinfo 将会立刻返回
$set: 等待的信号列表
$siginfo: 用来向调用者返回等待得到的信号的信息 , 该信息包含以下内容 :
1. 所有信号都有以下三个信息 :
a) signo: 信号编号
b) errno: 错误号
c) code: 信号代码
2. SIGCHLD 信号特有的信息
a) ステータス: 終了値またはシグナル
b) utime: ユーザーの消費時間
c) stime: システムの消費時間
d) pid: 送信プロセス ID
e) uid: 送信プロセスの実際のユーザー ID SIGILL、SIGFPE 、SIGSEGV、SIGBUS が所有する情報
a) use using through ' s ' s through through using 's ' through ‐to ‐‐ ‐‐‐‐ and to
int pcntl_wait(int &$status[, int *options = 0] ):
子プロセスが終了するまで、またはシグナルによって現在のプロセスの終了が要求されるか、Exit の呼び出し時に子プロセスがすでに呼び出されている場合 (一般にゾンビプロセスになる) まで、現在のプロセスをハングします。 、この関数はすぐに戻り、すべてのシステム リソースが解放されます。
$status は、子プロセスのステータス情報を保存するために使用されます。このステータス情報は、pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、pcntl_wtermsig、によって生成されます。 pcntl_wstopsig.
$options: システムで wait3 が許可されている場合 (ほとんどの BSD 類似システム)、オプションのオプション パラメーターを指定できます。このパラメーターが指定されていない場合、wait はシステム コールを使用します。このパラメータは効果がありません。$options の値は 0 または 2 つの定数 WNOHANG と WUNTRACED です。この関数は、終了している子プロセスの PID を返します。エラーが発生した場合、または WNOHANG がオプションとして指定されている場合は -1 を返します (システム)。 wait3 が利用できない場合)、有効な子プロセスが存在しない場合は、0 を返します
ゾンビプロセス: 親プロセスはフォーク後であるため、子プロセスがいつ終了するかを予測することは不可能であるため、子プロセスは親に何らかの情報を残します子プロセスの終了 (論理的な終了) から親プロセスがその死体を収集するまでの期間を、ゾンビと呼ばれるデータ構造と呼びます。親プロセスが終了すると、その後、すべての子プロセスが Init に引き継がれます。そのため、親プロセスが終了しない場合は、ゾンビ プロセスが常に占有されます。システムプロセス番号が枯渇すると、新しいプロセスを開始できなくなります。したがって、安全な方法は、親プロセス内で自分自身で生成された子プロセスの死体を収集することです。 int $pid, int &$status[, int $options = 0]):
指定された $pid を持つ子プロセスが終了するか、現在のプロセスが終了シグナルを受信するか、呼び出すための ige シグナルを受信するまで、現在のプロセスを一時停止します。シグナル ハンドラー。
指定された $pid に対応する子プロセスがこれを呼び出している場合、関数は終了しました (ゾンビ状態)。関数はすぐに戻り、すべてのシステム リソースが解放されます。
$pid: プロセス番号 (-1 未満)。 -1 は、プロセス グループ内の子プロセスを待機していることを示し、プロセス グループ番号は $pid の絶対値です。 -1 は、pcntl_wait 関数の動作と一致して、紫禁城を待機していることを示します。 0 は呼び出しプロセスと同じグループ内の子プロセスを待機していることを示し、0 より大きい場合は特定のプロセスを示します。
$status: このステータス情報は、次の関数によって生成されます。 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、pcntl_wtermsig、pcntl_wstopsig.
$options: pcntl_wait の $options と同じ意味です
int pcntl_wexitstatus(int $status):
この関数は、中断された子プロセスの戻りコードを返します。 pcntl_wife 終了しました関数は TRUE を返します。 $status パラメーターは、pcntl_waitpid によって生成されたステータス情報です。
bool pcntl_wifexited(int $status):
指定されたステータスが子プロセスが正常に終了したことを示しているかどうかを確認します。
bool pcntl_wifsignaled (int $status):指定されたステータスが、子プロセスが特定のシグナルを受信したために終了したことを示しているかどうかを確認します。
bool pcntl_wifstopped(int $status):
$status が子プロセスが現在停止していることを示すことができるかどうかを確認します。この関数は動作している場合にのみ有効です。 pcntl_waitpid 関数で使用される WUNTRACED が $options パラメーターの値として使用されるときに生成される $status について、
int pcntl_wstopsig(int $status):
$status を分析して、子プロセスを停止するシグナルの番号を返します。関数のみ pcntl_wifsignaled が TRUE を返す場合にのみ有効です。
int pcntl_wtermsig(int $status):
プロセスを中断するシグナル番号を返します。この関数は、pcntl_wifsignaled が TRUE を返す場合にのみ有効です。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHP で使用されている拡張子を確認するには、phpinfo() 関数の出力を表示し、コマンド ライン ツールを使用して、PHP 構成ファイルを確認します。 1. phpinfo() 関数の出力を表示し、単純な PHP スクリプトを作成し、このスクリプトを phpinfo.php として保存し、Web サーバーにアップロードします。ブラウザでこのファイルにアクセスし、ブラウザの検索機能を使用します。キーワードを探すだけです。ページ上の「extension」または「extension_loaded」で拡張機能に関する情報を見つけます。

PHP を使用して SuiteCRM のレポート生成機能を拡張する方法 SuiteCRM は、企業が顧客関係を管理するのに役立つ豊富な機能を提供する強力なオープンソース CRM システムです。重要な機能の 1 つはレポート生成であり、レポートを使用することにより、企業はビジネス状況をより深く理解し、正しい意思決定を行うことができます。この記事では、PHP を使用して SuiteCRM のレポート生成機能を拡張する方法と、関連するコード例を紹介します。開始する前に、SuiteCRM がインストールされていることを確認する必要があります。

PHP を使用して PDO を拡張し、Oracle データベースに接続する方法 はじめに: PHP は非常に人気のあるサーバー側プログラミング言語であり、Oracle は一般的に使用されるリレーショナル データベース管理システムです。この記事では、PHP 拡張機能 PDO (PHPDataObjects) を使用して Oracle データベースに接続する方法を紹介します。 1. PDO_OCI 拡張機能のインストール Oracle データベースに接続するには、まず PDO_OCI 拡張機能をインストールする必要があります。 PDO_OCI 拡張機能をインストールする手順は次のとおりです。

PHP を使用して開発する場合、いくつかの PHP 拡張機能を使用する必要がある場合があります。これらの拡張機能により、より多くの機能とツールが提供され、開発作業がより効率的かつ便利になります。ただし、これらの拡張機能を使用する前に、まずインストールする必要があります。この記事では、PHP 拡張機能をインストールする方法を紹介します。 1. PHP 拡張機能とは何ですか? PHP 拡張機能は、PHP プログラミング言語に追加の機能とサービスを提供するコンポーネントを指します。これらのコンポーネントは、PHP の拡張メカニズムを通じてインストールして使用できます。 PHP 拡張機能が役立つ

PHP は、Web ページ上の動的コンテンツを処理できる一般的なサーバー側スクリプト言語です。 PHP の geoip 拡張機能を使用すると、PHP でユーザーの位置に関する情報を取得できます。この記事では、PHP の geoip 拡張機能の使用方法について説明します。 PHP の GeoIP 拡張機能とは何ですか? PHP の geoip 拡張機能は、IP アドレスと位置情報に関するデータを取得できる無料のオープンソース拡張機能です。この拡張機能は、MaxMin によって開発されたデータベースである GeoIP データベースで使用できます。

Pagoda Panel はオープンソースのサーバー管理パネルで、Web サイト運営者に便利な Web サイト管理、データベース管理、SSL 証明書管理などのサービスを提供するとともに、強力な PHP 拡張機能と PHP バージョン管理機能も提供し、サーバー管理を容易にします。効率的。 1. PHP 拡張機能 PHP 拡張機能は、PHP の機能を拡張するためのモジュールです。PHP 拡張機能をインストールすることで、次のような機能やサービスを実装できます。

PHPCNTL でのフォーク失敗の一般的なエラーと解決策 プロセス管理に PHPCNTL 拡張機能を使用すると、フォーク失敗の問題が頻繁に発生します。 forkとは子プロセスを作成する方法ですが、場合によっては何らかのエラーによりfork操作が失敗することがあります。この記事では、いくつかの一般的なフォーク失敗エラーとそれに対応する解決策を紹介し、読者がこれらの問題をよりよく理解して対処できるように具体的なコード例を示します。 1. メモリ不足に関する考えられるエラー メッセージ: 可能

PHP 拡張機能の開発は、カスタム機能を作成し、PHP コア機能を拡張し、より強力なアプリケーションを構築する技術です。これは PHP の世界に新たな可能性をもたらし、開発者が言語の基本的な制限を超えることができるようにします。この記事では、PHP 拡張機能の開発の旅へお連れし、基本的な概念から高度なテクニックまで、包括的な知識と実践的なガイダンスを提供します。 PHP 拡張機能開発の基本 PHP 拡張機能開発を開始する前に、いくつかの基本概念を理解する必要があります。 PHP拡張機能とは何ですか? PHP 拡張機能は、PHP のコア機能を拡張し、新しいデータ型、関数、クラスを提供するダイナミック リンク ライブラリ (DLL) です。 PHP 拡張機能の利点 PHP 拡張機能には、スケーラビリティ、柔軟性、パフォーマンスの最適化、コードの再利用など、多くの利点があります。 PHP
