Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Warning fopen() (http://forum.oszone.net/showthread.php?t=54195)

xamelion 23-09-2005 01:00 357771

Warning fopen()
 
Есть вот такая функция:
Код:

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 357783

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

xamelion 23-09-2005 06:19 357801

Сейчас из кода заменил одну строчку

Код:

$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 357831

что то мне кажется где то я вот такую функцию пропустил pclose();

vadimiron 23-09-2005 13:08 357942

а что содержится в переменной $squid_log_path?

vadimiron 23-09-2005 13:10 357944

pclose(); нужен когда открывается процесс функцией popen()

xamelion 23-09-2005 15:10 357991

$squid_log_path? = "/opt/squid/var/logs";

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

elfoflorien 23-09-2005 15:59 358011

xamelion
может быть, добавить строки проверки существования файла:

PHP код:

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 358022

Цитата:

то выдается вот такая ошибка

Код:
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
PHP код:

$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 358127

Но!, но если вызов функции зделать вот такую
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 358154

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

xamelion 24-09-2005 07:49 358214

Кто верит в приведения ?
В общем... читаю вышеуказанный пост mar, захожу на сервер, логинюсь, нахожу нужный файл, нахожу нужную функцию, перед функцией ставлю такой код
Код:

add_log(1);
add_log(8);

запускаю, браузер лагает, но выводит ответ первого и восьмого файла, я протирая глаза с просони... нажимаю F5 браузер выводит ответ функции первого и восьмого лога, гляжу вызов цункции, повторно его записываю, бегу в браузер, браузер чуть чуть тужится и выводит ответ первого и восьмого лога. Дастается зажигалка, прикуривается сигарета, ведется пятиминутное раскуривание-обдумывание. Нажимается F5 браузер неохотно выводит ответ, удаляются все "временный файлы" в браузере. Повторяется кнопка f5 результат "отлично". Господа, я первый раз поподаю в такую неловкую ситуацию, и мне очень стыдно перед вами. Дело в том что я со времени написания поста неизменял код т.к. валялся, да и воляюсь с температурой. к машине собственно имею доступ только я. Я больше чем уверен что во всем виноват личный ККР, Еще раз извеняюсь что..... что такой профан в php.
P.S. ККР - Коофициент кривизны рук.

xamelion 24-09-2005 08:25 358218

ой.. еще раз прошу прощения, ошибка так и остается открытая, в связи со своей невнимательностью я при последнем тесте убрал переменную $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 358238

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

xamelion 24-09-2005 11:00 358246

Код:

<?php
$wpath = "/project/";
$squid_log_path = "/opt/squid/var/logs/";
?>


vadimiron 24-09-2005 13:04 358267

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 358279

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

xamelion 24-09-2005 13:46 358286

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

xamelion 24-09-2005 14:10 358293

Может поможет весь код целиком?
дейсвия начинаются с файла 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
//////////////////////////////////////////////////////////////////////////////
?>



Время: 13:17.

Время: 13:17.
© OSzone.net 2001-