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
Trả lời
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
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ỉ)
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
vì không có ngoại lệ hủy/ngắt trong PHP –
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.
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.
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;
}
?>
Bạn có ý nghĩa trên dòng lệnh không? –
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