Утечка памяти?

Buldozer

Новичок
Утечка памяти?

есть скрипт вида

PHP:
function main($user_id)
	{
	$query1 = ...
	for...
		{
		$row = mysql_fetch_array($result)
		slave($user_options_list)
		}	

	$query2 = ...
	for...
		{
		$row = mysql_fetch_array($result)
		...
		slave($user_options_list)
		}

	}

function slave($user_options_list)
	{
	...
	$fp = @fopen("$full_patch", "r");
	@flock($fp, 1);
	$fp = @fopen("$full_patch", "w");
	@fputs($fp, "$content");
	@flock($fp, 3);
	@fclose($fp);
	}


foreach($list_user as $value)
	{
	main($value);
	}
Т.е. для каждого пользователя вызывается некоторая функция, которая выбирает определенные данные и отдает их на вход второй функции которая генерирует текстовые файлы содержащие эти данные.

Проблема следующая:
в случае если данных для записи очень много(т.е. slave внутни main вызывается очень много раз), скрипту на выполнение $query2 "не хватает сил", - $result = mysql_query($query); возвращает false. Т.е. что-то похожее на утечку памяти.
Было выявлено, что виной всему является вот этот кусок кода из функции slave:

PHP:
$fp = @fopen("$full_patch", "r");
@flock($fp, 1);
$fp = @fopen("$full_patch", "w");
@fputs($fp, "$content");
@flock($fp, 3);
@fclose($fp);
если его закомментировать в slave, то скрипт работает нормально.

Вроде не должно тут быть никакой утечки? Разъясните пожалуйста ситуацию.

-~{}~ 14.06.07 22:45:

Причем тормоза накапливаются только в пределах одной итерации main(); - т.е. может обработаться несколько тыс. пользователей с сумарным кол-вом вызовов slave() в 1млн. раз, и тормозов не будет... пока очередь не дойдет до некого "обломного юзера" с 30 тыс. вызовами slave(), и собственно на нем все обломается. И если обработать этого юзера первым, то на нем сразу же и обломается.

Т.е. это накопление? идет только в пределах одной итерации main().
Хотя по идее даже если бы там что-то накапливалось, то оно должно было остаться/обнулиться внутри slave(), как только та отработает.
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
//Открываете файл на чтение
$fp = @fopen("$full_patch", "r");
//Блокируете
@flock($fp, 1);
//Открываете _этот-же файл_ на запись, урезая до нулевой длинны...
$fp = @fopen("$full_patch", "w");

Вам так действительно точно нужно??
 

Buldozer

Новичок
этим маневром я хочу заблокировать файл в который буду делать запись, т.е. открыл его на чтение что бы получить указатель, заблокировал его и открыл его на запись.
Это не верно?
 

becool

Новичок
к последнему посту:
а что мешает fopen -> flock -> file_put_contents -> flock(LOCK_UN); ?
 

Buldozer

Новичок
видимо действительно лишний маневр, но без него легче не стало, оставил:

PHP:
//$fp = @fopen("$full_patch", "r");
//@flock($fp, 1);
$fp = @fopen("$full_patch", "w");
@fputs($fp, "$content");
//@flock($fp, 3);
@fclose($fp);

все равно обламывается.
 

Buldozer

Новичок
>А mysql_error ничего не пишет?
MySQL server has gone away

>я бы еще проверил открытие файла открывается он или нет
данные после первого "$query1 = ... " пишутся в файлы.
 

Активист

Активист
Команда форума
Читать мануалы нужно!
http://ru2.php.net/flock

PHP:
$fp = @fopen($full_patch, "w");
if (!$fp) {
echo "Error: can't open".$full_patch);
exit(1);
}

if (!flock($fp, LOCK_EX+LOCK_SH)) {
echo "Unable to lock file";
exit(1);
}
if (!fputs($fp, "$content")) {
echo "Unable to write data";
}
if (!flock($fp, LOCK_UN)) {
echo "Unable to unlock file";
exit(1);
}
fclose($fp);
-~{}~ 15.06.07 11:30:

>Вроде не должно тут быть никакой утечки?
Кстати, не знаю, что такое утечка =)
Если скрипту не хватит памяти он тебе об этом скажет :)
 

Buldozer

Новичок
>http://www.google.com/search?hl=en&...r+has+gone+away
если выдрать этот запрос в отдельный скрипт, то он всегда выполняется

в текущем скрипте, в случае false от mysql_result(), соединение с БД устанавливается заново... и на этом юзере оно восстанавливается/обрывается до бесконечности

-~{}~ 15.06.07 12:28:

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

kruglov

Новичок
В мануале, находимом в гугле, написано, что такое бывает, когда происходит таймаут из-за долгого необращения скрипта к базе.
 

Buldozer

Новичок
я читал это

mysql> show variables like "wait_timeout%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

8-мь часов, а скрипт с этим юзером обломаться успевает уже чере 3-4 минуты.

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

-~{}~ 15.06.07 16:25:

>в случае false от mysql_result(), соединение с БД устанавливается заново...

сейчас запустил скрипт, он вот так раз 20-ть конект восстанавливал, в итоге mysql выдал ошибку
PHP:
<b>Warning</b>:  mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Lost connection to MySQL server at 'reading authorization packet', system error: 0 in <b>/home3/tnx/cronjobs/static_generator_new6.php</b> on line <b>191</b><br />
<br />
<b>Warning</b>:  mysql_select_db() [<a href='function.mysql-select-db'>function.mysql-select-db</a>]: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) in <b>/home3/tnx/cronjobs/static_generator_new6.php</b> on line <b>192</b><br />
<br />
<b>Warning</b>:  mysql_select_db() [<a href='function.mysql-select-db'>function.mysql-select-db</a>]: A link to the server could not be established in <b>/home3/tnx/cronjobs/static_generator_new6.php</b> on line <b>192</b><br />
<br />
<b>Warning</b>:  mysql_query() [<a href='function.mysql-query'>function.mysql-query</a>]: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) in <b>/home3/tnx/cronjobs/static_generator_new6.php</b> on line <b>193</b><br />
<br />
<b>Warning</b>:  mysql_query() [<a href='function.mysql-query'>function.mysql-query</a>]: A link to the server could not be established in <b>/home3/tnx/cronjobs/static_generator_new6.php</b> on line <b>193</b><br />
после этой месаги скрипт еще раз попытался восстановить соединение с БД, только уже без результатано, вывел еще одно такое же сообщение об ошибки и отвалился уже сам.

-~{}~ 15.06.07 16:26:

не нашел ничего в гугле на тему "Lost connection to MySQL server at 'reading authorization packet"

-~{}~ 15.06.07 21:33:

нашел ин-фу на тему
"Lost connection to MySQL server at 'reading authorization" - packet'http://bugs.mysql.com/bug.php?id=28359, увеличил как там рекомендуется connect_timeout до 30 секунд... соединение больше не отваливается, но база очень медленно начала работать.
 
Сверху