Войти

Показать полную графическую версию : Warning fopen()


xamelion
23-09-2005, 01:00
Есть вот такая функция:

function add_log($var_func)
{
include_once "config.php";
include_once "connect_db.php";
$fp = fopen ("$squid_log_path/access.log.$var_func","r");
while ($userinfo = fscanf ($fp, "%s\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t")) {
list ($datetime, $session, $ip_client, $http_code, $size, $request_m, $url, $ident, $data_host, $type) = $userinfo;
$date_ok = date('Y-n-j H:i:s', strtotime('+3 hour', $datetime));

$ip_drop = sscanf($ip_client, "%d\x2E%d\x2E%d\x2E%d");
list ($ip1, $ip2, $ip3, $ip4) = $ip_drop;
$ip1_h = dechex ($ip1);
$ip2_h = dechex ($ip2);
$ip3_h = dechex ($ip3);
$ip4_h = dechex ($ip4);

$result = mysql_query("INSERT INTO squid_log VALUES ('$ip1_h','$ip2_h','$ip3_h','$ip4_h','$date_ok','$url','$http_code','$size','$session')")
or die("Invalid query");
if ($result)
echo "<FONT COLOR=GREEN>ok</FONT><BR>";
else
echo "<FONT COLOR=RED>false</FONT>";

}; // while
fclose($fp);

} //func

если ДО функции в коде написать код add_log(1); то функция вызовится нормально, если же написать вот такой код add_log(1);
add_log(8); то выдается вот такая ошибка
Warning: fopen(/access.log.8): failed to open stream: No such file or directory in /var/www/html/project/squid.php on line 101

Warning: fscanf(): supplied argument is not a valid File-Handle resource in /var/www/html/project/squid.php on line 102

Warning: fclose(): supplied argument is not a valid stream resource in /var/www/html/project/squid.php on line 124

Опять же, если просто использовать функцию add_log(8); то функция вызывается.

vadimiron
23-09-2005, 02:40
Первый Warning говорит, что нет такого файла
Два других-это следствие того, что файл не был открыт
Почему так происходит - хмм..... По какой то причине не находит файл

xamelion
23-09-2005, 06:19
Сейчас из кода заменил одну строчку

$fp = fopen ("$squid_log_path/access.log.$var_func","r");

на

$fp = fopen ("/opt/squid/var/logs/access.log.$var_func","r");

и код благополучно выполнил всю работу. но почему? ведь писать путь к файлам целиком это не есть хорошо, в случаи миграции кода на другую систему сколько надо будет перелопатить...

xamelion
23-09-2005, 09:04
что то мне кажется где то я вот такую функцию пропустил pclose();

vadimiron
23-09-2005, 13:08
а что содержится в переменной $squid_log_path?

vadimiron
23-09-2005, 13:10
pclose(); нужен когда открывается процесс функцией popen()

xamelion
23-09-2005, 15:10
$squid_log_path? = "/opt/squid/var/logs";

ну переменная записанна в файле config.php

elfoflorien
23-09-2005, 15:59
xamelion
может быть, добавить строки проверки существования файла:


if( file_exists( "$squid_log_path/access.log.$var_func" ))
$fp = fopen ("$squid_log_path/access.log.$var_func","r");
else
die( "log file access.log.$var_func does not exist" );

elfoflorien
23-09-2005, 16:31
то выдается вот такая ошибка

Код:
Warning: fopen(/access.log.8): failed to open stream: No such file or directory in /var/www/html/project/squid.php on line 101

Warning: fscanf(): supplied argument is not a valid File-Handle resource in /var/www/html/project/squid.php on line 102

Warning: fclose(): supplied argument is not a valid stream resource in /var/www/html/project/squid.php on line 124

xamelion
$fp = fopen ("$squid_log_path/access.log.$var_func","r");
как, скажите мне, может появиться путь /access.log.8, если была конкретная строчка,
в которой был прописан путь с $squid_log_path, и $squid_log_path действительно
имеет значение?
$squid_log_path? = "/opt/squid/var/logs";
значит, в переменной $squid_log_path нет пути, и ошибку надо искать в этом?

xamelion
23-09-2005, 20:45
Но!, но если вызов функции зделать вот такую
add_log(1);
то код выполнится верно
если же вот такую строчку:
add_log(8);
То код тоже выполняет все верно, Но если вписать до функции сразу 2 вызова функции скажем так
add_log(1);
add_log(8);
то код не_будет выполнен корректно и даст ошибку.

Ошибка выводится только если выполнять эту функцию 2 и более раза, в одинарном случаи он выполняет и add_log(1); и add_log(8);
а это значит что конфиг.ПХП путя, файл, хард и видяшка работает отлично. Проблема лишь в том что на второй раз вызов функции дает збой.

P.S. Почему только у меня талант клепать такие ошибки ?

mar
23-09-2005, 23:12
xamelion
хорошо, но давайте, чтобы не было сомнений и можно было идти дальше, введите в начале функции echo $squid_log_path и давайте посмотрим, что вернется.

xamelion
24-09-2005, 07:49
Кто верит в приведения ?
В общем... читаю вышеуказанный пост mar, захожу на сервер, логинюсь, нахожу нужный файл, нахожу нужную функцию, перед функцией ставлю такой код add_log(1);
add_log(8); запускаю, браузер лагает, но выводит ответ первого и восьмого файла, я протирая глаза с просони... нажимаю F5 браузер выводит ответ функции первого и восьмого лога, гляжу вызов цункции, повторно его записываю, бегу в браузер, браузер чуть чуть тужится и выводит ответ первого и восьмого лога. Дастается зажигалка, прикуривается сигарета, ведется пятиминутное раскуривание-обдумывание. Нажимается F5 браузер неохотно выводит ответ, удаляются все "временный файлы" в браузере. Повторяется кнопка f5 результат "отлично". Господа, я первый раз поподаю в такую неловкую ситуацию, и мне очень стыдно перед вами. Дело в том что я со времени написания поста неизменял код т.к. валялся, да и воляюсь с температурой. к машине собственно имею доступ только я. Я больше чем уверен что во всем виноват личный ККР, Еще раз извеняюсь что..... что такой профан в php.
P.S. ККР - Коофициент кривизны рук.

xamelion
24-09-2005, 08:25
ой.. еще раз прошу прощения, ошибка так и остается открытая, в связи со своей невнимательностью я при последнем тесте убрал переменную $squid_log_path и на ее место поставил путь целиком до файловой системы ( об этом я писал в последнем посте ) и так и не убрал это.
mar
function add_log($var_func)
{
include_once "config.php";
include_once "connect_db.php";
echo "$squid_log_path <BR>";
$fp = fopen ("$squid_log_path/access.log.$var_func","r");
while ($userinfo = fscanf ($fp, "%s\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t")) {
list ($datetime, $session, $ip_client, $http_code, $size, $request_m, $url, $ident, $data_host, $type) = $userinfo;
$date_ok = date('Y-n-j H:i:s', strtotime('+3 hour', $datetime));

$ip_drop = sscanf($ip_client, "%d\x2E%d\x2E%d\x2E%d");
list ($ip1, $ip2, $ip3, $ip4) = $ip_drop;
$ip1_h = dechex ($ip1);
$ip2_h = dechex ($ip2);
$ip3_h = dechex ($ip3);
$ip4_h = dechex ($ip4);

$result = mysql_query("INSERT INTO squid_log VALUES ('$ip1_h','$ip2_h','$ip3_h','$ip4_h','$date_ok','$url','$http_code','$size','$session')")
or die("Invalid query");
if ($result)
echo "<FONT COLOR=GREEN>ok</FONT><BR>";
else
echo "<FONT COLOR=RED>false</FONT>";
}; // while

я добавил эхо, результат вот такой:
/opt/squid/var/logs/
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok


Warning: fopen(/access.log.8): failed to open stream: No such file or directory in /var/www/html/project/squid.php on line 105

Warning: fscanf(): supplied argument is not a valid File-Handle resource in /var/www/html/project/squid.php on line 106

Warning: fclose(): supplied argument is not a valid stream resource in /var/www/html/project/squid.php on line 128
exit


вывод "ОК" "зеленым цветом", это ничто иное как удачно записанная строка из лога.

Если поменять вызов цункций местами, Вот так например:

add_log(8);
add_log(1);

то получается вот такой ответ:
/opt/squid/var/logs/
ok
....
( В связи что в файле "access.log.8" 1082 Строки, ответ чуть чуть порезан для читабельности)
....
ok
ok
ok
ok
ok
ok
ok
ok


Warning: fopen(/access.log.1): failed to open stream: No such file or directory in /var/www/html/project/squid.php on line 105

Warning: fscanf(): supplied argument is not a valid File-Handle resource in /var/www/html/project/squid.php on line 106

Warning: fclose(): supplied argument is not a valid stream resource in /var/www/html/project/squid.php on line 128
exit

elfoflorien
24-09-2005, 09:50
xamelion
если не сложно, напиши, пожалуйста код config.php. может, что-нибудь прояснится
это случайно не phpBB2?

xamelion
24-09-2005, 11:00
<?php
$wpath = "/project/";
$squid_log_path = "/opt/squid/var/logs/";
?>

vadimiron
24-09-2005, 13:04
xamelion
Я не уверен, что в этом ошибка, но мало ли что бывает...:
У Вас переменная $squid_log_path содержит /opt/squid/var/logs/ , то есть уже с закрывающим слешем , но когда вы вызываете функцию fopen, вы используете такой адрес в качестве параметра $squid_log_path/access.log.$var_func , опять со слешем, то есть путь до файла сейчас /opt/squid/var/logs//access.log.$var_func , что естественно не очень правильно в контексте определённой ОС, либо система ищет файл /access.log.$var_func

Попробуйте один из слешей убрать, что получиться?

xamelion
24-09-2005, 13:34
Я уже постил по поводу "правильности написания слешей" http://forum.oszone.net/showthread.php?t=53904 но меня проигнорили....
я попробую сейчас изменить слеши, когда ответ дам, незнаю, потому что в москве щас из за падения линии проблемы с сайтами .net .com и вообще что дальше москвы :)

xamelion
24-09-2005, 13:46
убрал один слешь с файла config.php результат такой же.
убирать слешь со страки этот $squid_log_path/access.log.$var_func нету смысла. получится "$squid_log_pathaccess.log.$var_func"

xamelion
24-09-2005, 14:10
Может поможет весь код целиком?
дейсвия начинаются с файла index.php откуда передается параметр find_squid_file После чего вызывается функция find_squid_file();<?
////////////////////////////////////////////////////////
foreach($_REQUEST as $index => $val)
{
if ('find_squid_file' == $index )
find_squid_file();
if ('show' == $index )
show_ii();

if ('show_log0' == $index )
add_log(0);
if ('show_log1' == $index )
add_log(1);
if ('show_log2' == $index )
add_log(2);
if ('show_log3' == $index )
add_log(3);
if ('show_log4' == $index )
add_log(4);
if ('show_log5' == $index )
add_log(5);
if ('show_log6' == $index )
add_log(6);
if ('show_log7' == $index )
add_log(7);
if ('show_log8' == $index )
add_log(8);
if ('show_log9' == $index )
add_log(9);
if ('show_log_all' == $index )
all_log();


echo "exit<br>";
exit();
}
////////////////////////////////////////////////////////
?>

<?
///////////////////////////////////////////////////////////////////////////
function find_squid_file()
{
include "config.php";
$a_while = 0;
while ($a_while <= 9){
global $squid_file;
$squid_file[] = file_exists("$squid_log_path/access.log.$a_while");


$a_while++;
}; //while



show_file_log();
?>
<form action = "squid.php" method="post">
<input type="submit" name="show_log_all" value="перечитать все логи"><br>
</input>
</form>
<?
}; //func
/////////////////////////////////////////////////////////////////////////////
?>

<?
/////////////////////////////////////////////////////
function all_log()
{


add_log(8); // Временно вызваны 2 функции, ниже цикл закоментирован
add_log(1); // по пречине описанной чуть ниже, как только цикл заработает, цикл будет вызывать функции с переменными.

/*
global $squid_file; // Вот с этим циклом у меня тоже проблемы, я пытаюсь
foreach ($squid_file as $index => $var){ // их решить один, т.к. не решался закидывать
if ($var == 1){ // весь "флуд-код" на форум, так же замечу что php я занимаюсь меньше месяца,
add_log($var); // поэтому я уверен что ошибок тут будет миллион. Одну критику я уже воспринил,
}; // это поповоду mysql базы, правильнее будет вставлять данные не в цикле, а копить
}; //foreach // их, а затем целиком вставить. В общем то критика очень даже приветствуется.
// Тут проблема в том что после строки global $squid_file; массив пустой :(

*/

}; //func
/////////////////////////////////////////////////////
?>

<?
/////////////////////////////////////////////////////////////////////////////
function add_log($var_func)
{
include_once "config.php";
include_once "connect_db.php";
echo "$squid_log_path <BR>";
$fp = fopen ("$squid_log_path/access.log.$var_func","r");
while ($userinfo = fscanf ($fp, "%s\t%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\t%s\t")) {
list ($datetime, $session, $ip_client, $http_code, $size, $request_m, $url, $ident, $data_host, $type) = $userinfo;
$date_ok = date('Y-n-j H:i:s', strtotime('+3 hour', $datetime));

$ip_drop = sscanf($ip_client, "%d\x2E%d\x2E%d\x2E%d");
list ($ip1, $ip2, $ip3, $ip4) = $ip_drop;
$ip1_h = dechex ($ip1);
$ip2_h = dechex ($ip2);
$ip3_h = dechex ($ip3);
$ip4_h = dechex ($ip4);

$result = mysql_query("INSERT INTO squid_log VALUES ('$ip1_h','$ip2_h','$ip3_h','$ip4_h','$date_ok','$url','$http_code','$size','$session')")
or die("Invalid query");
if ($result)
echo "<FONT COLOR=GREEN>ok</FONT><BR>";
else
echo "<FONT COLOR=RED>false</FONT>";

}; // while
fclose($fp);

} //func
//////////////////////////////////////////////////////////////////////////////
?>

<?
///////////////////////////////////////////////////////////////////////////////
function show_file_log()
{
include_once "config.php";
global $squid_file; // А тут он например без проблем работает.
foreach ($squid_file as $index => $var){
if ($var == 1){
?>
<form action = "squid.php" method="post">
<input type="submit" name="show_log<?echo $index;?>" value="пересчитать лог-файл access.log.<?echo $index;?>">
</input>
Размер <?echo filesize("/opt/squid/var/logs/access.log.$index")?> байт.
Создан <?echo date('Y-n-j H:i:s', (filemtime("/opt/squid/var/logs/access.log.$index")))?>
</form>
<?
};
}; //foreach
}; //func
//////////////////////////////////////////////////////////////////////////////
?>




© OSzone.net 2001-2012