ডেমন প্রক্রিয়া হিসাবে পিএইচপি স্ক্রিপ্ট চালান


154

ডেমন প্রক্রিয়া হিসাবে আমাকে পিএইচপি স্ক্রিপ্ট চালানো দরকার (নির্দেশের জন্য অপেক্ষা করুন এবং স্টাফ করুন)। ক্রোন জব আমার পক্ষে এটি করবে না কারণ নির্দেশ আসার সাথে সাথে পদক্ষেপ নেওয়া দরকার। আমি জানি পিএইচপি হ'ল মেমরি পরিচালনা সংক্রান্ত সমস্যার কারণে ডেমন প্রক্রিয়াগুলির জন্য সেরা বিকল্প নয়, তবে বিভিন্ন কারণে আমাকে এই ক্ষেত্রে পিএইচপি ব্যবহার করতে হবে। আমি ডিমন ( http://libslack.org/daemon ) নামক লাইবস্ল্যাকের মাধ্যমে একটি সরঞ্জাম পেয়েছি যা দেখে মনে হয় এটি ডেমন প্রক্রিয়াগুলি পরিচালনা করতে সহায়তা করে, তবে গত 5 বছরে কোনও আপডেট হয়নি, তাই আমি অবাক হয়েছি যদি আপনি কিছু জানেন আমার ক্ষেত্রে উপযুক্ত অন্যান্য বিকল্প। যে কোনও তথ্য সত্যই প্রশংসা করা হবে।


2
আমার উত্তর পরীক্ষা করুন। ধন্যবাদ
হেনরিক পি। হেসেল

সম্পর্কিত: stackoverflow.com/q/4717167/212218

1
আমি এই পোস্টটি জুড়ে এসেছি gonzalo123.com/2010/05/23/… যা আমি বিশ্বাস করি শিথিল এবং স্থিতিশীল উভয়ই।
টেসন

উত্তর:


167

আপনি আপনার পিএইচপি স্ক্রিপ্টটি ব্যবহার করে কমান্ড লাইন (যেমন বাশ) থেকে শুরু করতে পারেন

nohup php myscript.php &

&ব্যাকগ্রাউন্ডে আপনার প্রক্রিয়া রাখে।

সম্পাদনা:
হ্যাঁ, কিছু ত্রুটি রয়েছে, তবে নিয়ন্ত্রণ করা সম্ভব নয়? এটা ঠিক ভুল।
একটি সাধারণ kill processidএটি বন্ধ করবে। এবং এটি এখনও সেরা এবং সহজ সমাধান।


টার্মিনাল উপস্থিত থাকলে প্রক্রিয়াটি প্রস্থান করবে না। এজন্য সেখানে "নোহুপ" কমান্ড রয়েছে। আমি এখন বহু বছর ধরে এই জাতীয় সার্ভারগুলিতে ডেমন হিসাবে পিএইচপি স্ক্রিপ্টটি ব্যবহার করছি। আরও ভাল সমাধান হতে পারে, তবে এটি দ্রুততম সমাধান।
সিডিআর

27
এটি ডেমনটি ব্যর্থ হলে এটি পুনরায় আরম্ভ করবে না এবং ডেমনকে পরিচালনা করার কোনও সহজ উপায় নেই।
ফিল ওলাচ

6
এখানে যা বলা হয়েছে তার সাথে আমি একমত - এটি একটি খারাপ সমাধান। বেশ কয়েকটি কারণে আপনার একটি এনআর স্ক্রিপ্ট তৈরি করা উচিত: ১) আর্ট স্ক্রিপ্টটি স্টার্টআপে স্বয়ংক্রিয়ভাবে চালু হয় 2) আপনি স্টার্ট / স্টপ / পুনঃসূচনা কমান্ডের সাহায্যে ডিমন পরিচালনা করতে পারেন। সার্ভফল্ট থেকে এখানে একটি উদাহরণ দেওয়া হয়েছে: serverfault.com/questions/229759/…
সিমিয়ান

1
আরে ছেলেরা ... এটি আমার কাছে মনে হয় nohupএবং &একই জিনিসটি হয়: শেলের বর্তমান প্রবণতা থেকে প্রবর্তন প্রক্রিয়াটি বিচ্ছিন্ন করে। আমার দু'জনের দরকার কেন? আমি শুধু না করতে পারি php myscript.php &বা nohup myscript.php?? ধন্যবাদ
নুরডাইন

1
স্ক্রিপ্টটি যদি স্টডআউটে (প্রতিধ্বনি বা ভার_ডাম্পের মাধ্যমে) লিখতে থাকে তবে আপনি এই জাতীয় লগ ফাইলের মাধ্যমে এই তথ্যটি ধরতে পারেন:nohup php myscript.php > myscript.log &
Mischa

167

আরেকটি বিকল্প হ'ল আপস্টার্ট ব্যবহার করা । এটি মূলত উবুন্টুর জন্য তৈরি হয়েছিল (এবং এটি ডিফল্টরূপে প্যাকেজড আসে), তবে এটি সমস্ত লিনাক্স ডিস্ট্রোসের জন্য উপযুক্ত হওয়ার উদ্দেশ্যে।

এই পদ্ধতিরটি সুপারভাইজার্ড এবং ডেমনটোলেসের অনুরূপ , এটি স্বয়ংক্রিয়ভাবে সিস্টেম বুটে ডেমনটি শুরু করে এবং স্ক্রিপ্ট সমাপ্তির জন্য পুনর্নির্মাণ করে।

এটি কীভাবে সেট আপ করবেন:

এখানে একটি নতুন স্ক্রিপ্ট ফাইল তৈরি করুন /etc/init/myphpworker.conf। এখানে একটি উদাহরণ:

# Info
description "My PHP Worker"
author      "Jonathan"

# Events
start on startup
stop on shutdown

# Automatically respawn
respawn
respawn limit 20 5

# Run the script!
# Note, in this example, if your PHP script returns
# the string "ERROR", the daemon will stop itself.
script
    [ $(exec /usr/bin/php -f /path/to/your/script.php) = 'ERROR' ] && ( stop; exit 1; )
end script

আপনার ডেমন শুরু এবং থামিয়ে দিচ্ছেন:

sudo service myphpworker start
sudo service myphpworker stop

আপনার ডেমন চলছে কিনা তা পরীক্ষা করুন:

sudo service myphpworker status

ধন্যবাদ

কেভিন ভ্যান জোনেভেল্ডকে ধন্যবাদ জানাই , যেখানে আমি এই কৌশলটি শিখেছি।


2
এই ভালবাসা। শুধু ভাবছি, একাধিক সমবর্তী শ্রমিক থাকা কি সম্ভব? আমার কেবল সমস্যা আছে যে একজন শ্রমিক আর যথেষ্ট নয়।
ম্যানুয়েল

1
এটি কি স্বয়ংক্রিয়ভাবে সিস্টেম স্টার্টআপে চলবে?
সরু

2
সুডো "পরিষেবা মাইফপ ওয়ার্কার শুরু" আমার পক্ষে কাজ করে না। আমি "sudo start myphpworker" ব্যবহার করেছি এবং এটি পুরোপুরি কাজ করে
ম্যাট সিচ

3
@ প্রদীপ্ত এই কারণেই পোস্টটিতে একটি ত্রুটি রয়েছে - আমি ঠিক নিশ্চিত নই কি (এবং এটি পরীক্ষা করা হয়নি) তবে আমি মনে করি যে sudo service myphpworker start/stop/statusকেবলমাত্র পরিষেবাগুলির সাথে কাজ করে যা /etc/init.dআপস্টার্ট পরিষেবাগুলিতে নেই। @ ম্যাট-সিচ মনে হচ্ছে সঠিক বাক্য গঠনটি উন্মোচিত করেছে। আরেকটি বিকল্প হ'ল গিয়ারম্যান বা রেসকে ব্যবহার করা, যা ব্যাকগ্রাউন্ড প্রসেসিং এবং ডিমনোয়াইজেশনকে অনুমতি দেয়।
ckm

3
উবুন্টু নিজেই upstart এর পরিবর্তে systemd ব্যবহার করতে চলেছে: zdnet.com/article/ after
linux-

72

নতুন সিস্টেমডের সাহায্যে আপনি একটি পরিষেবা তৈরি করতে পারেন।

আপনি একটি ফাইল বা তৈরি করতে হবে সিমবলিক লিঙ্ক/etc/systemd/system/যেমন। myphpdaemon.service এবং এটির মতো সামগ্রী রাখুন, মাইফপডেমোন সেবার নাম হবে:

[Unit]
Description=My PHP Daemon Service
#May your script needs MySQL or other services to run, eg. MySQL Memcached
Requires=mysqld.service memcached.service 
After=mysqld.service memcached.service

[Service]
User=root
Type=simple
TimeoutSec=0
PIDFile=/var/run/myphpdaemon.pid
ExecStart=/usr/bin/php -f /srv/www/myphpdaemon.php arg1 arg2> /dev/null 2>/dev/null
#ExecStop=/bin/kill -HUP $MAINPID #It's the default you can change whats happens on stop command
#ExecReload=/bin/kill -HUP $MAINPID
KillMode=process

Restart=on-failure
RestartSec=42s

StandardOutput=null #If you don't want to make toms of logs you can set it null if you sent a file or some other options it will send all php output to this one.
StandardError=/var/log/myphpdaemon.log
[Install]
WantedBy=default.target

আপনি কমান্ডটি ব্যবহার করে পরিষেবাগুলি শুরু করতে, স্থিতি পেতে, পুনরায় চালু করতে এবং পরিষেবাগুলি বন্ধ করতে সক্ষম হবেন

systemctl <start|status|restart|stop|enable> myphpdaemon

পিএইচপি স্ক্রিপ্ট চলমান চালিয়ে যেতে এক ধরণের "লুপ" থাকা উচিত।

<?php
gc_enable();//
while (!connection_aborted() || PHP_SAPI == "cli") {

  //Code Logic

  //sleep and usleep could be useful
    if (PHP_SAPI == "cli") {
        if (rand(5, 100) % 5 == 0) {
            gc_collect_cycles(); //Forces collection of any existing garbage cycles
        }
    }
}

কাজের উদাহরণ:

[Unit]
Description=PHP APP Sync Service
Requires=mysqld.service memcached.service
After=mysqld.service memcached.service

[Service]
User=root
Type=simple
TimeoutSec=0
PIDFile=/var/run/php_app_sync.pid
ExecStart=/bin/sh -c '/usr/bin/php -f /var/www/app/private/server/cron/app_sync.php  2>&1 > /var/log/app_sync.log'
KillMode=mixed

Restart=on-failure
RestartSec=42s

[Install]
WantedBy=default.target

যদি আপনার পিএইচপি রুটিন একবার একবার চক্রের মধ্যে চালিত করা উচিত (ডিজাইগস্টের মতো) আপনার পিএইচপি-র পরিবর্তে সরাসরি সিস্টেমেড সার্ভিস ফাইলে ডাকার জন্য শেল বা ব্যাশ স্ক্রিপ্ট ব্যবহার করা উচিত, উদাহরণস্বরূপ:

#!/usr/bin/env bash
script_path="/app/services/"

while [ : ]
do
#    clear
    php -f "$script_path"${1}".php" fixedparameter ${2}  > /dev/null 2>/dev/null
    sleep 1
done

এইসব বিকল্পটি পরিবর্তন করা উচিত বেছে নেওয়া হয়েছে তাহলে KillMode করার mixedপ্রসেস করা, ব্যাশ (প্রধান) এবং পিএইচপি (শিশু) হত্যা করা হয়।

ExecStart=/app/phpservice/runner.sh phpfile parameter  > /dev/null 2>/dev/null
KillMode=process

This method also is effective if you're facing a memory leak.

দ্রষ্টব্য: আপনি যখনই "" myphpdaemon.service "পরিবর্তন করেছেন তখন অবশ্যই আপনাকে অবশ্যই` systemctl ডেমন-রিলোড 'চালাতে হবে, তবে আপনি যদি তা না করেন তবে চিন্তিত হন, যখন প্রয়োজন হবে তখন সতর্কতা অবলম্বন করা হবে।


7
আন্ডাররেটেড উত্তর। আপনার আমার +1 আছে।
গার্গলি লুকাক্সি

2
অসাধারণ. আশা করি আমরাও হৃদয় উত্তর দিতে পারি কারণ এটি এই পৃষ্ঠায় সমাহিত করা উচিত নয়।
জাস্টিন

1
আপনার systemctl status <your_service_name> -lআউটপুট চেক করা উচিত , এটি আপনাকে কী ঘটছে তার একটি ক্লু দেবে।
লিওনানকার্ভালো

1
@ লিন্ড্রো টুপোন মাইএসকিউএল এবং মেমক্যাচ এটি কীভাবে পরিষেবা নির্ভরতা ব্যবহার করবেন তা একটি প্রদর্শন ছিল।
লিওনান কারভালহো

3
এটি এখন 2019 এর মত হ'ল গ্রহণযোগ্য উত্তরটি প্রতিস্থাপন করা উচিত
মশলা

47

আপনি যদি পারেন - ইউনিক্স পরিবেশে উন্নত প্রোগ্রামিংয়ের একটি অনুলিপি ধরুন । পুরো অধ্যায় 13 ডিমন প্রোগ্রামিংয়ের জন্য নিবেদিত। উদাহরণগুলি সিতে রয়েছে তবে পিএইচপিতে আপনার প্রয়োজনীয় সমস্ত ফাংশনটির মোড়ক রয়েছে (মূলত পিসিএনটিএল এবং পোস্টিক্স এক্সটেনশন)।

কয়েকটি কথায় - একটি ডেমন লেখার জন্য (এটি কেবল * নিক্স ভিত্তিক ওএস-এস-এর উপর নির্ভরযোগ্য - উইন্ডোজ পরিষেবাগুলি ব্যবহার করে) এইরকম:

  1. umask(0)অনুমতি সংক্রান্ত সমস্যাগুলি রোধের জন্য কল করুন ।
  2. fork() এবং অভিভাবক প্রস্থান করুন।
  3. কল করুন setsid()
  4. এর সেটআপ সিগন্যাল প্রসেসিং SIGHUP(সাধারণত এটি উপেক্ষা করা হয় বা এটির কনফিগারেশনটি পুনরায় লোড করার জন্য সিগন্যাল ব্যবহৃত হয়) এবং SIGTERM(প্রক্রিয়াটি সুদৃ .়ভাবে প্রস্থান করার জন্য বলার জন্য)।
  5. fork() আবার এবং অভিভাবক প্রস্থান করুন।
  6. বর্তমান কর্মরত দির সাথে পরিবর্তন করুন chdir()
  7. fclose() stdin, stdoutএবং stderrতাদের লিখবেন না। সঠিক উপায় হ'ল এগুলি হয় /dev/nullবা একটি ফাইলের দিকে পুনর্নির্দেশ করা , তবে আমি পিএইচপি-তে এটি করার কোনও উপায় খুঁজে পাইনি। শেল ব্যবহার করে সেগুলি পুনর্নির্দেশের জন্য আপনি যখন ডিমনটি চালু করেন তখন এটি সম্ভব হয় (কীভাবে এটি করবেন তা আপনাকে নিজেরাই খুঁজে নিতে হবে, আমি জানি না :))।
  8. তোমার কাজ করো!

এছাড়াও, যেহেতু আপনি পিএইচপি ব্যবহার করছেন, চক্রীয় রেফারেন্সগুলির জন্য সতর্ক থাকুন, যেহেতু পিএইচপি আবর্জনা সংগ্রহকারী, পিএইচপি 5.3 এর আগে এই রেফারেন্সগুলি সংগ্রহ করার কোনও উপায় নেই এবং প্রক্রিয়াটি মেমরি ফাঁস হবে, যতক্ষণ না এটি শেষ পর্যন্ত ক্রাশ হয়।


1
তথ্যের জন্য ধন্যবাদ। দেখে মনে হচ্ছে লাইবস্ল্যাকের ডেমন প্রোগ্রামটি আপনার উল্লেখ মতো সমস্ত প্রস্তুতিমূলক কাজ করে। আমি মনে করি আপাতত আমি এটির সাথে থাকব যতক্ষণ না আমি অন্যান্য ভাল বিকল্পগুলি খুঁজে পাই।
বিয়ার

1
এই পোস্টটি পাওয়া গেছে, একটি কৃপণ পুরানো অ্যাপ্লিকেশনটিতে কপি এবং পেস্ট করার প্রত্যাশিত কোড যা স্ট্ডিন বন্ধ করতে ব্যর্থ হয় ইত্যাদি হতাশ হয়েছিল। : পি
থিফমাস্টার

1
কেন আবার (5) কাঁটাচামচ ()?
TheFox

আমার জন্য কাজ - দুর্দান্ত কাজ!
গৌতম শর্মা

ভবিষ্যতের পাঠকরা কেন দুবার কাঁটাচামচ করবেন তা জিজ্ঞাসা করার জন্য: স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / 881388/… - টিএল; ডিআর: জম্বিগুলি প্রতিরোধ করে।
Gedipunk

24

আমি প্রচুর পিএইচপি ডেমন চালাচ্ছি।

আমি আপনার সাথে একমত যে পিএইচপি এটি করার জন্য সেরা (বা এমনকি একটি ভাল) ভাষা নয়, তবে ডেমনগুলি ওয়েব-মুখী উপাদানগুলির সাথে কোড ভাগ করে তোলে সামগ্রিকভাবে এটি আমাদের জন্য একটি ভাল সমাধান।

আমরা এর জন্য ডিমনটোল ব্যবহার করি। এটি স্মার্ট, পরিষ্কার এবং নির্ভরযোগ্য। বাস্তবে আমরা এটি আমাদের সমস্ত ডেমন চালানোর জন্য ব্যবহার করি।

আপনি http://cr.yp.to/daemontools.html এ এটি পরীক্ষা করে দেখতে পারেন ।

সম্পাদনা: বৈশিষ্ট্যগুলির একটি দ্রুত তালিকা।

  • পুনরায় বুট করার সময় স্বয়ংক্রিয়ভাবে ডেমোন শুরু হয়
  • ব্যর্থতার পরে স্বয়ংক্রিয়ভাবে দামান পুনরায় চালু করুন
  • রোলওভার এবং ছাঁটাই সহ আপনার জন্য লগিং পরিচালনা করা হয়
  • পরিচালন ইন্টারফেস: 'এসভিসি' এবং 'এসভিস্ট্যাট'
  • ইউনিক্স বান্ধব (সবার জন্য সম্ভবত একটি প্লাস নয়)

সংগ্রহস্থলগুলি থেকে ইনস্টলযোগ্য, যেমন অ্যাপে!
Kzqai

14

আপনি পারেন

  1. nohupহেনরিকের পরামর্শ মতো ব্যবহার করুন ।
  2. এর মধ্যে screenনিয়মিত প্রক্রিয়া হিসাবে আপনার পিএইচপি প্রোগ্রামটি ব্যবহার করুন এবং চালান। এটি আপনাকে ব্যবহারের চেয়ে আরও নিয়ন্ত্রণ দেয় nohup
  3. মত একটি daemoniser ব্যবহার করুন http://supervisord.org/ (এটা পাইথন লেখা কিন্তু কোনো কমান্ড লাইন প্রোগ্রাম daemonise এবং আপনি এটি পরিচালনা করতে একটি রিমোট কন্ট্রোল দিতে পারেন)।
  4. এমিলের পরামর্শ মতো আপনার নিজের ডেমনাইস র‍্যাপারটি লিখুন তবে এটি আইএমওকে ছাড়িয়ে যায়।

আমি সবচেয়ে সহজ পদ্ধতির (আমার মতে পর্দা) সুপারিশ করব এবং তারপরে আপনি আরও বৈশিষ্ট্য বা কার্যকারিতা চাইলে আরও জটিল পদ্ধতিতে যান।


আপনি কি অনুরূপ সুপারভাইজার কনফিগারেশন সরবরাহ করতে পারেন?
অ্যালিক্স অ্যাক্সেল

11

এই সমস্যাটি সমাধানের একাধিক উপায় রয়েছে।

আমি নির্দিষ্টকরণগুলি জানি না তবে পিএইচপি প্রক্রিয়াটি ট্রিগার করার অন্য কোনও উপায় আছে। উদাহরণস্বরূপ, যদি আপনার কোনও এসকিউএল ডাটাবেসে ইভেন্টের উপর ভিত্তি করে চালানোর কোড দরকার হয় তবে আপনি আপনার স্ক্রিপ্টটি কার্যকর করতে একটি ট্রিগার সেটআপ করতে পারেন। পোস্টগ্র্রেএসকিউএল এর অধীনে এটি করা সত্যিই সহজ: http://www.postgresql.org/docs/current/static/external-pl.html

সত্যই আমি মনে করি আপনার সেরা বেটটি নোহুপ ব্যবহার করে ড্যামন প্রক্রিয়া তৈরি করা। nohup ব্যবহারকারীর লগ আউট করার পরেও কমান্ডটি চালিয়ে যাওয়ার অনুমতি দেয়:

nohup php myscript.php &

তবে খুব গুরুতর সমস্যা আছে। যেমন আপনি বলেছিলেন যে পিএইচপি-র মেমরি ম্যানেজারটি সম্পূর্ণ আবর্জনা, এমন একটি ধারণাটি তৈরি করা হয়েছিল যে কোনও স্ক্রিপ্ট কেবল কয়েক সেকেন্ডের জন্য কার্যকর হয় এবং তারপরে উপস্থিত থাকে। আপনার পিএইচপি স্ক্রিপ্টটি মাত্র কয়েক দিন পরে গিগাবিটি মেমরির ব্যবহার শুরু করবে। আপনার অবশ্যই একটি ক্রোন স্ক্রিপ্ট তৈরি করতে হবে যা প্রতি 12 বা 24 ঘন্টা চলতে পারে যা আপনার পিএইচপি স্ক্রিপ্টটিকে এভাবে মেরে এবং পুনরায় স্প্যান করে:

killall -3 php
nohup php myscript.php &

তবে স্ক্রিপ্টটি যদি কোনও কাজের মাঝে থাকত? ওয়েল কিল -3 একটি বাধা, এটি সিএলএল + সিটিএল + সি করার মতোই। আপনার পিএইচপি স্ক্রিপ্টটি এই বাধাকে ধরতে পারে এবং পিএইচপি পিসিএনটিএল লাইব্রেরিটি ব্যবহার করে করুণভাবে প্রস্থান করতে পারে: http://php.oregonstate.edu/manual/en/function.pcntl-signal.php

এখানে একটি উদাহরণ:

function clean_up() {
  GLOBAL $lock;
  mysql_close();
  fclose($lock)
  exit();
}
pcntl_signal(SIGINT, 'clean_up');

$ লকটির পিছনে ধারণাটি হল পিএইচপি স্ক্রিপ্টটি কোনও ফপেন ("ফাইল", "ডাব্লু") দিয়ে একটি ফাইল খুলতে পারে; কেবলমাত্র একটি প্রক্রিয়াতে কোনও ফাইলটিতে রাইটিং লক থাকতে পারে, সুতরাং এটি ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে আপনার পিএইচপি স্ক্রিপ্টের কেবল একটি অনুলিপি চলছে কিনা।

শুভকামনা!


10

কেভিন ভ্যান জোনেভেল্ড এ সম্পর্কে একটি খুব সুন্দর বিস্তারিত নিবন্ধ লিখেছিলেন , তাঁর উদাহরণে তিনি System_Daemonপিয়ার প্যাকেজটি ব্যবহার করেন (শেষ প্রকাশের তারিখ ২০০৯-০৯-২০১))।


6

পরীক্ষা করে দেখুন https://github.com/shaneharter/PHP-Daemon

এটি একটি অবজেক্ট-ভিত্তিক ডেমন লাইব্রেরি। এটিতে লগিং এবং ত্রুটি পুনরুদ্ধারের মতো বিষয়গুলির জন্য অন্তর্নির্মিত সমর্থন রয়েছে এবং এটি ব্যাকগ্রাউন্ড কর্মীদের তৈরি করার জন্য সমর্থন করে।


3

ডেমন হিসাবে পিএইচপি স্ক্রিপ্টগুলি চালানোর সমস্যাটির জন্য আমার সম্প্রতি একটি ক্রস-প্ল্যাটফর্ম সমাধান (উইন্ডোজ, ম্যাক এবং লিনাক্স) দরকার ছিল। আমি নিজের সি ++ ভিত্তিক সমাধান লিখে বাইনারিগুলি তৈরি করে সমস্যার সমাধান করেছি:

https://github.com/cubiclesoft/service-manager/

লিনাক্সের জন্য সম্পূর্ণ সমর্থন (সিসভিনিটের মাধ্যমে), তবে উইন্ডোজ এনটি পরিষেবা এবং ম্যাক ওএসএক্সও চালু হয়েছিল।

আপনার যদি কেবল লিনাক্সের প্রয়োজন হয়, তবে এখানে উপস্থাপন করা অন্যান্য কয়েকটি সমাধান যথেষ্ট স্বাদে এবং স্বাদের উপর নির্ভর করে কাজ করে। এই দিনগুলিতে আপস্টার্ট এবং সিস্টেমেড রয়েছে, যা সিস্টভিনিত স্ক্রিপ্টগুলির ফ্যালব্যাকস। তবে পিএইচপি ব্যবহারের পয়েন্টের অর্ধেকটি হ'ল এটি প্রকৃতির ক্রস-প্ল্যাটফর্ম, সুতরাং ভাষায় লিখিত কোডটিতে যেমন রয়েছে তেমন কাজ করার সুন্দর সুযোগ রয়েছে। সিস্টেমের পরিষেবাগুলির মতো নির্দিষ্ট বাহ্যিক ওএস-স্তরের দিকগুলি ছবিতে প্রবেশ করার সময় ঘাটতিগুলি দেখাতে শুরু করে তবে বেশিরভাগ স্ক্রিপ্টিং ভাষাতে আপনি এই সমস্যাটি পেয়ে যাবেন।

এখানে পিএইচপি ব্যবহারকারীল্যান্ডে কেউ প্রস্তাবিত হিসাবে সংকেত ধরার চেষ্টা করা ভাল ধারণা নয়। pcntl_signal()সাবধানে ডকুমেন্টেশনটি পড়ুন এবং আপনি দ্রুত শিখবেন যে পিএইচপি কিছু অপ্রীতিকর পদ্ধতি (বিশেষত, 'টিক্স') ব্যবহার করে সংকেতগুলি পরিচালনা করে যা প্রক্রিয়াগুলিতে খুব কম দেখা যায় এমন কোনও কিছুর জন্য চক্রের একগুচ্ছ চিবিয়ে তোলে (অর্থাত্ সংকেত)। পিএইচপি-তে সিগন্যাল হ্যান্ডলিং কেবলমাত্র পসিক্স প্ল্যাটফর্মে পাওয়া যায় এবং পিএইচপি-র সংস্করণের ভিত্তিতে সমর্থন পৃথক হয়। এটি প্রথমদিকে শালীন সমাধানের মতো মনে হয় তবে এটি সত্যিকারের উপযোগী হয়ে ওঠে short

পিএইচপি সময় বাড়ার সাথে সাথে মেমরি ফাঁস সংক্রান্ত সমস্যাগুলি সম্পর্কে আরও ভাল হয়ে উঠছে। আপনার এখনও সতর্ক হতে হবে (ডোম এক্সএমএল পার্সারটি এখনও ফাঁস হতে থাকে) তবে আমি খুব কমই এই দিনগুলিতে পলাতক প্রক্রিয়া দেখতে পাই এবং পিএইচপি বাগ ট্র্যাকার ইয়ারের দিনগুলির সাথে তুলনা করে বেশ শান্ত।


1

অন্যরা ইতিমধ্যে উল্লেখ করেছে যে পিএইচপি ডেমোন হিসাবে চালানো বেশ সহজ, এবং একক লাইন কমান্ড ব্যবহার করে করা যেতে পারে। তবে আসল সমস্যাটি এটি চালিয়ে রাখা এবং পরিচালনা করা। বেশ কিছুদিন আগেও আমার একই সমস্যা ছিল এবং যদিও ইতিমধ্যে প্রচুর সমাধান ইতিমধ্যে উপলব্ধ রয়েছে, তাদের বেশিরভাগেরই প্রচুর নির্ভরতা রয়েছে বা ব্যবহার করা কঠিন এবং মৌলিক ব্যবহারের জন্য উপযুক্ত নয়। আমি একটি শেল স্ক্রিপ্ট লিখেছিলাম যা পিএইচপি ক্লাইপ স্ক্রিপ্ট সহ কোনও প্রক্রিয়া / অ্যাপ্লিকেশন পরিচালনা করতে পারে। অ্যাপ্লিকেশন শুরু করার জন্য এটি ক্রোনজব হিসাবে সেট করা যেতে পারে এবং অ্যাপ্লিকেশনটি ধারণ করে পরিচালনা করতে পারে। যদি এটি আবার কার্যকর হয়, উদাহরণস্বরূপ একই ক্রোনজব এর মাধ্যমে, এটি পরীক্ষা করে থাকে যে অ্যাপটি চলছে কি না, যদি তা না হয় কেবল প্রস্থান করে এবং এর পূর্ববর্তী উদাহরণটি অ্যাপ্লিকেশন পরিচালনা চালিয়ে যেতে দেয়।

আমি এটি গিথুবে আপলোড করেছি, এটি নির্দ্বিধায় ব্যবহার করুন: https://github.com/sinasalek/EasyDeamonizer

EasyDeamonizer

কেবল আপনার অ্যাপ্লিকেশন (স্টার্ট, পুনঃসূচনা, লগ, মনিটর ইত্যাদি) উপর নজর রাখে। আপনার আবেদন সঠিকভাবে চলমান রয়েছে তা নিশ্চিত করার জন্য একটি জেনেরিক স্ক্রিপ্ট। ইচ্ছাকৃতভাবে এটির সমস্ত পার্শ্ব প্রতিক্রিয়া রোধ করতে এবং স্ক্রিপ্টটিকে যতটা সম্ভব সহজ এবং যত তাড়াতাড়ি আলোড়নযোগ্য রাখার জন্য প্রসেস নেম ইন্সট্রেড ব্যবহার করে, তাই ইজিডেমোনাইজার নিজেই পুনরায় আরম্ভ করার পরেও এটি সর্বদা কাজ করে। বৈশিষ্ট্য

  • অ্যাপ্লিকেশন শুরু করে এবং প্রতিটি শুরুর জন্য allyচ্ছিকভাবে একটি কাস্টমাইজড দেরি
  • নিশ্চিত করে যে কেবল একটি উদাহরণ চলছে
  • সিপিইউ ব্যবহার পর্যবেক্ষণ করে এবং অ্যাপটি সংজ্ঞায়িত থ্রেশহোল্ডে পৌঁছালে স্বয়ংক্রিয়ভাবে পুনরায় চালু হয়
  • যদি কোনও কারণে বন্ধ হয়ে থাকে তবে এটি আবার চালানোর জন্য ক্রোন দিয়ে চালিয়ে যাওয়ার জন্য ইজিডিমোনাইজার সেট করা
  • এর ক্রিয়াকলাপ লগ করে

1

এমিল ইভাভ উত্তরটি প্রসারিত করে , আপনি পিএইচপি-তে এসটিডিন, স্টাটআউট এবং স্টাডিআরআর বন্ধ করতে নিম্নলিখিতগুলি করতে পারেন

if (!fclose(STDIN)) {
    exit("Could not close STDIN");
}

if (!fclose(STDOUT)) {
    exit("Could not close STDOUT");
}

if (!fclose(STDERR)) {
    exit("Could not close STDERR");
}

$STDIN = fopen('/dev/null', 'r');
$STDOUT = fopen('/dev/null', 'w');
$STDERR = fopen('/var/log/our_error.log', 'wb');

মূলত আপনি স্ট্যান্ডার্ড স্ট্রিমগুলি বন্ধ করেন যাতে পিএইচপি-র লেখার কোনও স্থান না থাকে। নিম্নলিখিত fopenকলগুলি মানক IO সেট করবে /dev/null

আমি এটি রব অ্যালির বই থেকে পড়েছি - ওয়েবের বাইরেও পিএইচপি


0

আমি একটি সাধারণ পিএইচপি-ডেমন লিখেছি এবং স্থাপন করেছি, কোডটি এখানে অনলাইনে

https://github.com/jmullee/PhpUnixDaemon

বৈশিষ্ট্যগুলি: প্রিভিলেজ ড্রপিং, সিগন্যাল হ্যান্ডলিং, লগিং

আমি এটিকে একটি সারি-হ্যান্ডলারে ব্যবহার করেছি (কেস ব্যবহার করুন: ওয়েব-পৃষ্ঠা থেকে একটি দীর্ঘ অপারেশন ট্রিগার করুন, পৃষ্ঠা উত্পন্ন পিএইচপি অপেক্ষা না করে, অর্থাত একটি অ্যাসিনক্রোনাস অপারেশন চালু করুন) https://github.com/jmullee/PhpIPCMessageQueue


0

আপনি এখানে pmpm চেক করতে পারেন, http://pm2.keymetrics.io/

আপনার পিএইচপি স্ক্রিপ্টের মধ্যে কর্মী.শ রাখার মতো একটি এসএসএস ফাইল তৈরি করুন যা আপনি মোকাবেলা করবেন।

worker.sh

php /path/myscript.php

ডিমন শুরু

pm2 start worker.sh

চিয়ারস, এটি হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.