English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

أساسيات إتصالات عملية الإشارات في PHP

استخدام إشارات الاتصال. يمكنك التحقق من أنواع الإشارات في النظام باستخدام الأمر kill -l.
تفاصيل كل إشارة، يرجى الرجوع إلى هذا المقال الخاص بي: https://ar.oldtoolbag.com/article/106040.htm
عند استخدام الإشارات، يمكنك التحقق من إصدار PHP الحالي باستخدام php --version. تم اتخاذ قرار حول كيفية إجراء إشارات بين العمليات.

[root@roverliang ipc]# php --version
PHP 5.6.24 (cli) (مبنى: 15 آب 2016 19:14:02)
حقوق النشر (c) 1997-2016 مجموعة PHP
Zend Engine v2.6.0، حقوق النشر (c) 1998-2016 Zend Technologies

استخدام دالة pcntl_signal_dispatch يحتاج إلى إصدار PHP (PHP 5 >= 5.3.0، PHP 7)

إذا كان إصدار PHP أقل من 5.3، قد تكون بعض الشركات تحت هذا الإصدار. في هذه الحالة، يتم استخدام declare(ticks=1)، مما يعني كل مرة يتم فيها تنفيذ جملة أساسية واحدة،}}
سيتم التحقق من وجود الإشارة. يمكنك الاطلاع على المزيد من التفاصيل في https://ar.oldtoolbag.com/article/48340.htm

يوضح الموقع الإلكتروني التالي: Tick (المدة الزمنية) هو حدث يحدث في كل مرة يتم فيها تنفيذ N جملة قابلة للقياس من الجمل الأساسية في جزء declare من الكود. يتم تحديد قيمة N في جزء directive من declare باستخدام ticks=N.

ما هو الجملة الأساسية؟ كما هو موضح في الكود التالي:

  for ($i = 0; $i < 3; $i++) {
    echo $i.PHP_EOL;
  }

إذن يحتوي هذا الدوران على ثلاثة أوامر أساسية. كل مرة يتم فيها إخراج $i، يتم التحقق من حدوث الحدث المسجل. يمكن تخيل أن هذا الكفاءة منخفضة نسبيًا. لذا إذا تم إصدار PHP الخاص بك أكبر من أو يساوي 5.3، يتم استخدام pcntl_singal_dispath لإجراء توزيع الإشارات.

تسجيل بعض وظائف معالجة الإشارات عند بدء عملية رئيسية.

/**
 * @param $signal إشارة
 */
function signalHandal($signal)
{
  switch ($signal) {
    case SIGINT:
      // تفعل شيئًا
      break;
    case SIGHUP:
      // تفعل شيئًا
      break;
    default :
      // تفعل شيئًا
      break;
  }
}

ثم يتم ربط معالج الإشارة بوظيفة معالجة الإشارة:

// وفقًا لإشارة مختلفة، يتم تثبيت معالج إشارة مختلف.
pcntl_signal(SIGINT, 'signalHandal');
pcntl_signal(SIGHUP, 'signalHandal');
pcntl_signal(SIGUSR1, 'signalHandla');

في عملية فرعية، يتم الاستماع إلى الإشارات، إذا حدثت الإشارة، يتم استدعاء وظيفة معالجة الإشارات المسبقة.

// تخصيص الإشارات.
pcntl_signal_dispatch($signal);

دعونا نرتب أفكارنا:
1. تعريف وظيفة يجب معالجة الحدث الذي يحدث عند إصدار الإشارة
2. ربط الإشارات بوظائف معالجة الإشارات، يُدعى ذلك تركيب الإشارات.
3. الاستماع إلى إشارات أو توزيعها، يتم استدعاء الإشارة المثبتة.

فهموا مفهوم الإشارات المذكور أعلاه، ونرى مثالاً على ذلك:

<?php
$parentpid = posix_getpid();
echo "parent progress pid:{$parentpid}\n";
//Define a signal handling function
function sighandler($signal) {
  if ($signal == SIGINT) {
    $pid = getmypid();
    exit("{$pid} process, Killed!".PHP_EOL);
  }
}
//php version < 5.3 . Each low-level instruction executes, check once whether the signal appears. Efficiency loss is very large.
//declare(ticks=1);
$child_list = [];
//تسجيل معالج إشارة. عند إصدار هذه الإشارة، يتم استدعاء الدالة المحددة
pcntl_signal(SIGINT, 'sighandler');
for($i = 0; $i < 3; $i++) {
  $pid = pcntl_fork();
  if ($pid == 0) {
    //child process
    //تطبيق معالج إشارات مثبت، لتحديد ما إذا كان هناك إشارة جديدة قيد الانتظار للإرسال
      pcntl_signal_dispatch();
      echo "I am child: ".getmypid(). " and i am running !".PHP_EOL;
      sleep(rand(1,3));
      elseif($pid > 0) {
    }
  }
    $child_list[] = $pid;
  } else {
    die('fork fail!'.PHP_EOL);
  }
}
sleep(5);
foreach ($child_list as $key => $pid) {
  posix_kill($pid, SIGINT);
}
sleep(2);
echo "{$parentpid} parent is end".PHP_EOL;
سيذهب لك هذا