2010-05-05 24 views
14

Ai đó có thể chỉ cho tôi đúng hướng để nghiên cứu cách ngăn người dùng thoát khỏi tập lệnh php với Ctrl + Z, Ctrl + C?Cách tắt ctrl-z, ctrl-c khỏi vi phạm tập lệnh php

+4

Bạn có ý nghĩa trên dòng lệnh không? –

+0

Có, sẽ là một dòng lệnh chạy mà tôi không muốn người dùng có thể thoát ra, về cơ bản. Xin lỗi vì các chi tiết kém chất lượng trong bài đăng, vẫn thức dậy. – teksolo

Trả lời

2

Cố gắng chạy nó ở chế độ nền (thêm & đến hết lệnh):

./your_php_script & 
+0

Điều gì xảy ra nếu tập lệnh yêu cầu tương tác của người dùng? – GreenMatt

+0

Tất nhiên, giải pháp của tôi không thể sử dụng được đối với các tập lệnh yêu cầu bất kỳ tương tác nào – silent

4

Sử dụng ignore_user_abort chức năng. Đặt điều này trong php.ini ignore_user_abort thành true. Nếu thay đổi thành TRUE script sẽ không bị chấm dứt sau khi client đã hủy kết nối của chúng, do đó script sẽ kết thúc.

ignore_user_abort(true); 

hoặc

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

ctrl + z sẽ cố định bất kỳ sự cố nào, mặc dù – silent

+0

@teksolo và @silent Tôi chưa bao giờ thử nghiệm nó, nhưng sẽ rất tốt nếu biết nó hoạt động –

+0

Đây là cho tương tác trên web. Tuy nhiên, trong một bình luận, OP cho biết ông muốn điều này cho một kịch bản dòng lệnh. – GreenMatt

-1

Nếu khả thi, bạn có thể quấn vòng lặp chính trong một khối try-catch, và dẹp trừ Abort/Interrupt (không chắc chắn một trong những chính xác, xin lỗi, PHP của tôi là một chút gỉ)

+0

Trong khi viết tắt chi tiết, cách tiếp cận của câu trả lời này có vẻ là phương pháp duy nhất cho tập lệnh dòng lệnh, vì vậy tôi không nhận được câu trả lời. – GreenMatt

+2

vì không có ngoại lệ hủy/ngắt trong PHP –

16

Nếu bạn đã biên dịch php với PCNTL (Điều khiển quy trình) và không chạy Windows, bạn có thể sử dụng pcntl_signal().

Có một ví dụ here mà tôi thay đổi, và có vẻ như để bắt Ctrl-C ok:

<?php 
declare(ticks = 1); 

pcntl_signal(SIGINT, "signal_handler"); 

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

while(1) { 

} 

Nếu bạn cố gắng cài đặt một handler cho SIGSTP có gì xảy ra, nhưng tôi không biết tại sao.

+1

Ngoài ra SIGTSTP là dành cho Ctrl + Z – silent

+1

SIGSTP và SIGSTOP là các tín hiệu khác nhau :) – silent

+1

@silent: thanks. tôi thực sự không biết mình đang nói gì ở đây –

4

Có cách để làm điều đó bằng cách tắt trong trình bao.

Source có tại đây.

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

# your script 
echo " Test" 

# loop for sleep 
sleep 5 

20 là dành cho tổ hợp phím CTRL + Z

2 là dành cho tổ hợp phím CTRL + C

và đây là danh sách đầy đủ của tạo ra bởi cái bẫy - | command

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 

tuy nhiên để làm điều này trực tiếp từ PHP là khó khăn, tôi không chắc chắn làm thế nào để làm điều đó hoặc nếu nó có thể được thực hiện. nếu không một số trang web đề xuất javascript để nắm bắt tổ hợp phím. hi vọng điêu nay co ich.

0

Nếu bạn sử dụng các giá trị số (thay vì các hằng số PHP dựng sẵn) thì có vẻ như nó hoạt động, ít nhất là đối với tôi, trên hệ thống Debian/Ubuntu.

Thật kỳ lạ, trong ví dụ dưới đây, hàm gọi lại signal_handler() không được gọi. Thay vào đó, nó chỉ hiển thị "^ Z" và "^ C" trên dòng đầu vào, trong khi các tín hiệu đơn giản bị bỏ qua. Cuối cùng, không thể ngắt/tạm ngưng, hy vọng sẽ trả lời câu hỏi gốc:

#!/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; 
} 
?> 
Các vấn đề liên quan