PHP: pcntl_fork() в командной строке OSX

У меня есть Macbook Pro с OSX Yosemite. Я пытаюсь запустить простой PHP-скрипт, используя pcntl_fork() в командной строке (команда: php pcntl.php):

<?php
    $pid = pcntl_fork();

    switch($pid) {
        case -1:
            print "Could not fork!\n";
            exit;
        case 0:
            print "In child!\n";
            break;
        default:
            print "In parent!\n";
    }
?>

Ответ таков:

Неустранимая ошибка: вызов неопределенной функции pcntl_fork() в
/Users/grant/Desktop/test/pcntl.php в строке 2.

Я видел множество статей, в которых показано, как установить pcntl, если вы используете mamp, но если вы просто используете терминал, как бы вы установили pcntl? Если это невозможно в командной строке, работает ли что-то подобное в PHP?


person Grant    schedule 25.06.2015    source источник


Ответы (1)


В случае нативного CLI действовать так же, как и в случае MAMP. Единственная разница в том, что вы должны добавить поддержку родной php, а не MAMP.

PHP Yosemite не имеет поддержки pcntl. Следующая команда не возвращает никаких результатов:

$ php -i | grep pcntl

Проверьте свою версию php:

$ php -v
  PHP 5.5.20 (cli) (built: Feb 25 2015 23:30:53)

Загрузите и соберите модуль pcntl:

$ wget http://php.net/distributions/php-5.5.20.tar.xz
$ tar xf php-5.5.20.tar.xz
$ cd php-5.5.20
$ cd ext/pcntl/
$ phpize
$ ./configure
$ make

Скопируйте модуль в папку с расширениями:

$ sudo cp modules/pcntl.so /usr/lib/php/extensions/no-debug-non-zts-20121212/

Отредактируйте файл конфигурации php.ini:

$ sudo vi /etc/php.ini

И добавьте строку extension=pcntl.so в секцию Dynamic Extensions, например:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

; If you wish to have an extension loaded automatically, use the following
; syntax:
;
;   extension=modulename.extension
;
; For example, on Windows:
;
;   extension=msql.dll
;
; ... or under UNIX:
;
;   extension=msql.so
;
; ... or with a path:
;
;   extension=/path/to/extension/msql.so
;
; If you only provide the name of the extension, PHP will look for it in its
; default extension directory.

extension=pcntl.so

Еще раз проверьте поддержку pcntl (на этот раз поддержка включена):

$ php -i | grep pcntl
  pcntl
  pcntl support => enabled

Запуск вашего тестового скрипта:

$ php -f test.php
  In parent!
  In child!
person baf    schedule 25.06.2015
comment
Отлично, это можно расширить и для другого модуля;).. хороший - person onalbi; 10.04.2016