2010-05-05 8 views
14

किसी Ctrl +जेड के साथ एक PHP स्क्रिप्ट से बाहर तोड़ने से उपयोगकर्ताओं को रोकने के लिए कैसे शोध के लिए सही दिशा में मुझे बात कर सकता हूँ से निष्क्रिय करने के लिए Ctrl-Z, Ctrl-C, Ctrl + सी?कैसे एक PHP स्क्रिप्ट को तोड़ते

+4

क्या आप कमांड लाइन पर हैं? –

+0

हां, एक कमांड लाइन स्क्रिप्ट चल रही होगी जो मैं नहीं चाहता कि उपयोगकर्ता अनिवार्य रूप से बाहर निकलने में सक्षम हों। पोस्ट में कमजोर विवरण के लिए खेद है, अभी भी जाग रहा है। – teksolo

उत्तर

2

पृष्ठभूमि में इसे चलाने (कमांड के अंत में & जोड़ने) करने के लिए प्रयास करें:

./your_php_script & 
+0

क्या होगा अगर स्क्रिप्ट को उपयोगकर्ता इंटरैक्शन की आवश्यकता हो? – GreenMatt

+0

बेशक, मेरा समाधान स्क्रिप्ट के लिए प्रयोग योग्य नहीं है जिसके लिए किसी भी इंटरैक्शन की आवश्यकता होती है – silent

4

उपयोग ignore_user_abort कार्य करते हैं। इसे php.ini ignore_user_abort में सत्य में सेट करें। यदि ग्राहक द्वारा कनेक्शन को निरस्त करने के बाद TRUE स्क्रिप्ट में बदला जाता है, तो स्क्रिप्ट समाप्त हो जाएगी।

ignore_user_abort(true); 

या

$ php my_script.php -d ignore_user_abort = true 
+0

ctrl + z इसे किसी भी तरह फ्रीज कर देगा, हालांकि – silent

+0

@teksolo और @silent मैंने कभी इसका परीक्षण नहीं किया है, लेकिन यह जानना अच्छा होगा कि यह –

+0

है या नहीं वेब इंटरैक्शन के लिए। हालांकि, एक टिप्पणी में, ओपी का कहना है कि वह इसे कमांड लाइन स्क्रिप्ट के लिए चाहता है। – GreenMatt

-1

संभव हैं, तो आप एक कोशिश पकड़ ब्लॉक में मुख्य लूप लपेट कर सकते हैं और बीच में बंद करें/इंटरप्ट अपवाद (यकीन नहीं सटीक एक छुटकारा पाने, माफ करना, मेरी पीएचपी है थोड़ा सा जंगली)

+0

विवरण पर कम है, इस सवाल का जवाब का दृष्टिकोण एक कमांड लाइन स्क्रिप्ट के लिए केवल एक ही लगता है, इसलिए मैं downvote नहीं मिलता है। धन्यवाद: – GreenMatt

+2

क्योंकि पीएचपी –

16

यदि आपके पास PCNTL (प्रक्रिया नियंत्रण) के साथ संकलित PHP है और Windows नहीं चल रहे हैं तो आप pcntl_signal() का उपयोग कर सकते हैं।

एक उदाहरण here जो मैं संशोधित नहीं है, और यह Ctrl-C ठीक पकड़ने के लिए लगता है:

<?php 
declare(ticks = 1); 

pcntl_signal(SIGINT, "signal_handler"); 

function signal_handler($signal) { 
    switch($signal) { 
     case SIGINT: 
      print "Ctrl C\n"; 
    } 
} 

while(1) { 

} 

आप एक हैंडलर इंस्टॉल करना के लिए SIGSTP कुछ नहीं होता की कोशिश करते हैं, लेकिन मैं पता नहीं क्यों।

+1

में कोई बीच में बंद करें/बाधा अपवाद ही SIGTSTP Ctrl + Z – silent

+1

SIGSTP और SIGSTOP के लिए है अलग-अलग संकेतों :) – silent

+1

@silent हैं। मैं स्पष्ट रूप से नहीं जानता कि मैं यहां किस बारे में बात कर रहा हूं –

4

शैल में अक्षम होने से ऐसा करने का एक तरीका है।

Source यहां है।

#!/bin/bash 
# at start add 
trap "" 2 20 

# your script 
echo " Test" 

# loop for sleep 
sleep 5 

20 के लिए Ctrl + Z

2 CTRL + C

के लिए है और इस जाल के द्वारा बनाई गई की पूरी सूची है - | कमांड

1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL 
5) SIGTRAP  6) SIGABRT  7) SIGBUS  8) SIGFPE 
9) SIGKILL  10) SIGUSR1  11) SIGSEGV  12) SIGUSR2 
13) SIGPIPE  14) SIGALRM  15) SIGTERM  16) SIGSTKFLT 
17) SIGCHLD  18) SIGCONT  19) SIGSTOP  20) SIGTSTP 
21) SIGTTIN  22) SIGTTOU  23) SIGURG  24) SIGXCPU 
25) SIGXFSZ  26) SIGVTALRM 27) SIGPROF  28) SIGWINCH 
29) SIGIO  30) SIGPWR  31) SIGSYS  34) SIGRTMIN 
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 
63) SIGRTMAX-1 64) SIGRTMAX 

हालांकि PHP से सीधे ऐसा करना मुश्किल है, मुझे यकीन नहीं है कि यह कैसे करें या यदि यह किया जा सकता है। अन्यथा कुछ साइटों ने कीस्ट्रोक को कैप्चर करने के लिए जावास्क्रिप्ट का सुझाव दिया। उम्मीद है की यह मदद करेगा।

0

यदि आप संख्यात्मक मानों का उपयोग करते हैं (अंतर्निहित PHP स्थिरांक के बजाए) तो यह कम से कम मेरे लिए डेबियन/उबंटू सिस्टम पर काम करता प्रतीत होता है।

विचित्र रूप से पर्याप्त, नीचे दिए गए मेरे उदाहरण में, कॉलबैक फ़ंक्शन सिग्नल_हैंडलर() को नहीं कहा जा रहा है। इसके बजाए, यह केवल इनपुट लाइन पर "^ जेड" और "^ सी" प्रदर्शित करता है, जबकि संकेतों को केवल अनदेखा किया जा रहा है। अंत में, कोई ब्रेक/निलंबन संभव नहीं है, जो उम्मीद है कि मूल प्रश्न का उत्तर दें:

#!/usr/bin/php 
<? 
pcntl_signal(2, "signal_handler"); 
pcntl_signal(20, "signal_handler"); 

function signal_handler($signal) 
{ 
    echo("This is not even invoked..?\n"); 
} 

$end = FALSE; 

while($end == FALSE) 
{ 
    echo("Enter Q to quit: "); 
    $fp = fopen("php://stdin", "r"); 
    $line = fgets($fp); 
    $line = str_replace("\n", "", $line); 
    fclose($fp); 

    if(strtolower($line) == "q") $end = TRUE; 
} 
?> 
संबंधित मुद्दे