Остановите PHP CLI скрипт, чтобы дать пользователю возможность выйти с помощью CTRL-C - PullRequest
1 голос
/ 18 февраля 2011

Как приостановить выполнение сценария командной строки, чтобы дать пользователю возможность выйти из него с помощью Ctrl + C ?

Например, у меня есть этот сценарий для удаления идентификатора пользователя из ряда таблиц, но я бы хотел остановить сценарий перед тем, как действительно это сделать:

<?php

define('DBHOST', '/tmp');
define('DBNAME', 'XXX');
define('DBUSER', 'YYY');
define('DBPASS', 'ZZZ');

$TABLES = array('pref_game',
                'pref_hand',
                'pref_luck',
                'pref_match',
                'pref_misere',
                'pref_money',
                'pref_pass',
                'pref_rep',
                'pref_status',
                'pref_users'
        );

if ($argc != 2)
        exit("Missing user id\n");

if (!preg_match('/^([A-Z]{2}[0-9]+)$/', $argv[1], $matches))
        exit("Invalid user id\n");

$id = $matches[1];
printf("Deleting user %s Press CTRL-C to abort\n\n", $id);

# XXX stop here, but how? XXX

try {
        $db = new PDO('pgsql:host=' . DBHOST . '; dbname=' . DBNAME, DBUSER, DBPASS);
        $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        foreach ($TABLES as $table) {
                $sql = sprintf('delete from %s where id=?', $table);
                run_sql($db, $sql, $id);
        }

} catch (Exception $e) {
       exit('Database problem: ' . $e->getMessage());
}

function run_sql($db, $sql, $arg) {
        $sth = $db->prepare($sql);
        $sth->execute(array($arg));
        printf("SQL: %s\nAffected rows: %d\n\n", $sql, $sth->rowCount());
}

?>

Использование CentOS Linux 5.5 + PHP 5.1.6 + PostgreSQL 8.4.7.

Ответы [ 3 ]

10 голосов
/ 18 февраля 2011

Попробуйте с:

    printf("Deleting user %s Press CTRL-C to abort, enter to continue\n\n", $id);
    $fp = fopen("php://stdin","r");
    fgets($fp);

    echo "OK!";
2 голосов
/ 18 февраля 2011

sleep(5); будет ждать пять секунд.

Если вы хотите что-то более необычное:

function delay($duration) {
    while($duration) {
        echo "\rStarting in ".$duration--.'...';
        sleep(1);
    }
    echo "\n";
}

Если вы не хотите спать, но предпочитаете да /подсказка без стиля:

function confirm($question) {
    while(true) {
        $line = strtolower(trim(readline($question.'? [Y/n]')));
        if(!$line || $line == 'y') {
            return true;
        }
        elseif($line == 'n') {
            return false;
        }
    }
}
0 голосов
/ 18 февраля 2011

Используйте sleep() или читайте со стандартного ввода, пока не получите новую строку: http://php.net/manual/en/wrappers.php.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...