pechkin: (сумасшедший домик на вершине горы)
pechkin ([personal profile] pechkin) wrote2013-04-09 01:04 pm
Entry tags:

(no subject)

Я поторопился стереть пост про PHP на радостях, что все будто бы заработало, а оно нет.

Ситуация такая: попросили сделать интеграцию между BeanStalk и Mantis. Mantis бежит на удаленном сервере. К нему приходит пост-реквест с мессагой от Subversion, у него php-скрипт, который ее парсит и с параметрами вызывает другой скрипт. Когда мантис бежал на винде в нашей локалке, команда вызова этого скрипта была такой:

shell_exec("echo -n \"$message\" | C:\php\php.exe checkin.php $author 2>&1");

и работала. Потом мантис переехал на юникс-сервер. Я написал:

shell_exec("echo -n \"$message\" | /usr/bin/php ./checkin.php $author 2>&1");

и приготовился радоваться, ан шиш. Мне то говорится "sh: fork: retry: Resource temporarily unavailable", что объяснимо, хотя и непонятно, как преодолевать (не хочется переписывать мантисовский хозяйский скрипт, хер их знает, для чего еще он у них используется. То, если вдруг прорвется дальше, возникает следующая проблема: в том скрипте, который вызывается, есть проверка:

# Make sure this script doesn't run via the webserver
if( php_sapi_name() != 'cli' ) {
 echo "checkin.php is not allowed to run through the webserver.\n";
 exit( 1 );
}


и по ней он вылетает. Интересно, как же оно работало на винде, точно такие же запросы ведь получало. На PHP я никогда ничего не писал, тонкостей не понимаю.

Кстати, вообще довольно странная картина. Весь приемный скрипт, которому посылается реквест, выглядит так:

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL | E_STRICT);
date_default_timezone_set('UTC');

$json = rawurldecode(file_get_contents('php://input'));
$data = json_decode($json);

$author = $data->{'author'};
$message = $data->{'message'};

echo("Author: $author; Message: $message\n");

$output = shell_exec("echo -n \"$message\" | /usr/bin/php ./checkin.php $author 2>&1");
echo(date('Y-m-d H:i:s') . " checkin.php: $output\n");
?>


(Кое-что выкинуто, но суть такова)
Результат его вызова выглядит так:

2013-04-08 08:34:31 post-commit.php:
received JSON: {
"time": "2013/04/07 14:49:48 +0300",
"message": "Testing Integration, issue #3126",
"author_full_name": "Lev Shenderovich",
"author_email": "lev@viewbix.com",
"changed_dirs": [],
"changeset_url": "http://наш svn-сервер/репозиторий/changesets/2698",
"changed_files": [["branches/20130227_Admin/delete.me",
"add"]],
"author": "lev",
"revision": 2698
}
Author: lev; Message: Testing Integration, issue #3126
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:31 post-commit.php:
received JSON: Testing Integration, issue #3126

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:31 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:31 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:31 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
2013-04-08 08:34:54 checkin.php: Content-type: text/html

2013-04-08 08:34:32 post-commit.php:
received JSON:

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 17
Author: ; Message:
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
sh: fork: retry: Resource temporarily unavailable
sh: fork: Resource temporarily unavailable
2013-04-08 08:34:54 checkin.php:


Что за трудновыразимая херня происходит у меня со вводом-выводом?

Вопрос не очень срочный, поскольку задачу эту отложили. Как пойму, в чем дело, так и починю.

[identity profile] merlin-perm.livejournal.com 2013-04-09 10:38 am (UTC)(link)
Если вылетает по проверке "php_sapi_name() != 'cli'" - то, вероятно, бинарник /usr/bin/php - чистый cgi, а cli-версия, к примеру, лежит рядом и называется /usr/bin/php-cli (или вообще отсутствует). А в винде php.exe умеет и cgi, и cli.

Надо смотреть, что за php на этом юникс-сервере стоит.
Edited 2013-04-09 10:43 (UTC)

[identity profile] pechkin.livejournal.com 2013-04-09 11:54 am (UTC)(link)
Оу, е. Это решит проблему. Проверю.
stas: (Default)

[personal profile] stas 2013-04-11 06:31 pm (UTC)(link)
Да, кстати, проверяется это следующим образом - php -v. Он скажет что-то вроде PHP 5.3.16 (cli) (built: Aug 5 2012 20:57:39) - вот cli и интересная часть, это и есть sapi name.

[identity profile] pechkin.livejournal.com 2013-04-12 10:54 am (UTC)(link)
У меня нет там командной строки, только cpanel
stas: (Default)

[personal profile] stas 2013-04-12 05:55 pm (UTC)(link)
Хм, тогда хуже, с цпанелом я незнаком :) Могу только порекомендовать http://www.lowendbox.com/ - там VPS можно за копейки добыть, с командной строкой и всем. Если релевантно, конечно, если нет - извините за офтопик.

[identity profile] pechkin.livejournal.com 2013-04-14 10:32 am (UTC)(link)
Получен ответ:

2013-04-14 10:31:56 checkin.php: PHP 5.2.17 (cli) (built: Feb 1 2012 15:01:30)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
with the ionCube PHP Loader v4.2.2, Copyright (c) 2002-2012, by ionCube Ltd., and
with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies
stas: (Default)

[personal profile] stas 2013-04-14 11:31 pm (UTC)(link)
Хм. Получается, что таки cli. А что конкретно в post-commit.php в строках 16 и 17? Потому что похоже, что судя по вот этому:

received JSON: Testing Integration, issue #3126

Notice: Trying to get property of non-object in /home/viewbix/public_html/bugs/scripts/post-commit.php on line 16

Получает он вовсе не JSON, и соответственно json_decode возвращает false, который потом пытаются использовать, как обьект, что не получается.

А вот это:
sh: fork: retry: Resource temporarily unavailable

Означает, что на машине слишком много процессов бежит, и новые запускать не удаётся. Почему, трудно сказать.

[identity profile] pechkin.livejournal.com 2013-04-15 04:33 am (UTC)(link)
Спасибо. Эта штука заработала, с незначительными изменениями в хозяйском скрипте; она выдает пару warningов по поводу вывода, но их все равно никто не увидит.