Эта тема на forum.dklab.ru


Vlaimir: Ошибка CGI-приложения и зомби процессы
На хостинге стоит ограничение на 50 одновременно запущенных процессов. Сайт все время набирает больше процессов и перестает работать.
Через приложение top видно что большинство процессов - zombie процессы.

Что может в коде сайта на php создавать zombie процессы?
Юрий Насретдинов:
Что может в коде сайта на php создавать zombie процессы?
Если Вы форкаете процесс и не получаете его статус завершения, то остаётся зомби. В общем, почитайте, как правильно форкать процессы.
Vlaimir:
Я не "форкаю" процессы.

У меня есть конструкции типа
if (file_exists(CACHE_PATH.$top)) {
include(CACHE_PATH.$top);

Может быть в них причина?
Юрий Насретдинов:
Может быть в них причина?
Я Вам уже указал причину, по которой могут возникнуть zombie-процессы.
Vlaimir:
Если Вы форкаете процесс и не получаете его статус завершения, то остаётся зомби.
Немного не понимаю. Что такое "форкать" в данном контексте?

Как правильно "форкать" и получать статус завершения?
dimagolov:
Vlaimir, у Вас в коде вызов pcntl_fork встречается?
Vlaimir:
Нет.
dimagolov:
ну хоть set_time_limit (0) (или аналогичные по смыслу) есть?
Vlaimir:
В том то и дело, что ничего такого нет. Может это проблемы хостинга rbc.

Посещаемость сайта была 12000 человек в день. Сайт-библиотека. На хостинге стоит ограничение в 50 процессов.
То все работает нормально, то сплошные перегрузки с нарастанием зомби-процессов.
dimagolov:
Vlaimir, ну хоть определить что за скрипт становиться зомби можете?
Vlaimir:
Да, любой мой скрипт. Например, тот, что ниже идет. Все же я сейчас склоняюсь, что у хостера были проблемы или слишком много запросов к сайту.
Но все равно непонятная ситуация. Вот код вывода книги:
<?
include("connect/setup.php");

$book_url = $_GET['book_url'];
$avtor_url = $_GET['avtor_url'];
if (strlen($book_url) > 30 or strlen($author_url) > 30) {exit();}
$bookdir=CACHE_PATH_BOOK."/".$avtor_url."/";
$com_book_dir=CACHE_PATH_KOM_BOOK."/".$avtor_url."/";

//Если есть кэш книги - вкладываем его
if (file_exists($bookdir.$book_url))
{
//echo"Кэш";
include("dizain/up.shtm");
include($bookdir.$book_url);


//Если зарегистрирован
if (!isset ($login)) {include ("connect/add_bookobzor.php");}
else {include ("connect/add_bookobzor_log.php");}

//Если есть комментарий
if (file_exists($com_book_dir.$book_url)){include($com_book_dir.$book_url);}
else {include("dizain/view_book_obzor.php");}

include("dizain/up2.shtm");
include("dizain/niz.shtm");
exit();
}

//Иначе обращаемся к базе за книгой
include("connect/connect.php");
$query = "SELECT BookId,BookName, BookURLPage, BookPic,BookDescription,BookOrder,
BookURLMain, AuthorFIO, AuthorURLPage, CategoryName, CategoryURLName FROM $bookstable,$authorstable,$categoriestable
WHERE BookURLMain = '$book_url' and AuthorURLPage='$avtor_url' and $categoriestable.CategoryId = $bookstable.CategoryId";
$res = mysql_query($query) or die(mysql_error());
$row_num = mysql_num_rows($res);

//Если книга есть
if($row_num>0)
{
$row=mysql_fetch_array($res);
include("connect/tobook.php");

$categoryurlname= "/".$row['CategoryURLName']."/";
$categoryname= $row['CategoryName'];


$avtorname=$row['AuthorFIO'];
$authorurlpage="/".$row['AuthorURLPage']."/";
$bookid=$row['BookId'];

//Выводим книгу
include("dizain/up.shtm");

//Включаем запись кэша
ob_start();
echo "<TITLE> $bookname - $avtorname</TITLE>";
include("dizain/dizain_books.php");

$buffer = ob_get_contents();
ob_end_clean();
if (!file_exists(CACHE_PATH_BOOK.$avtor_url)){
mkdir (CACHE_PATH_BOOK.$avtor_url);}

$f = fopen($bookdir.$book_url, 'w');
fwrite($f, $buffer);
fclose($f);

echo $buffer;

//Добавление комментариев

if (!isset ($login)) {include ("connect/add_bookobzor.php");}
else {include ("connect/add_bookobzor_log.php");}

//Если есть комментарий
if (file_exists($com_book_dir.$book_url)){include($com_book_dir.$book_url);}
else {include("dizain/view_book_obzor.php");}

include("dizain/up_2.shtm");
include("dizain/niz.shtm");
exit();
}
header('Location: http://example.com/');
?>
dimagolov:
ну по крайней мере SQL-injections Вам обеспечены...
кроме того очень здорово включать в скрипт любой файл, что юзер подсунет. еще не нашел где можно залить бяку (может и не в этом скрипте, но наверно можно где-то) и вуаля - сервер исполняет скрипт залитый неизвестно кем. а что в нем.... Вы не догадываетемь пока.
хотя что тут думать - в начале заливаем через SQL-injections код в базу, потом просто запрашиваем его и он запишется на диск как "кэш" и потом вперед и с песней исполняем его на сервере.

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

Ужас, на таком уровне написан сайт с посещаемостью 1200 в день. Это же сколько троянов можно через него раздать????

Ссылка про SQL-injections
Юрий Насретдинов:
Vlaimir
В таком случае, спрашивайте хостера, в чём дело... Я, по крайней мере, не вижу тут ничего, что может вызвать кучу zombie-процессов.

Эта тема на forum.dklab.ru