Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Проблемы при открытии файла


Автор: dimcat 6.3.2008, 11:51
Следующая бодяга

Открываю файл для чтения

Код

$file = fopen("путь","r");
$buf=fread($file, 50000000);
fclose($file);


Иногда считывает нормально, но иногда на половине обрывает... Пример: http://hotelsandtours.ru/events/inc.php - пообновляйте несколько раз для получения представления...

Не подскажете, с чем сие может быть связано?

Автор: A1ekcandr 6.3.2008, 11:53
не понял проблемы там должно по 2 показываться домика?

Автор: dimcat 6.3.2008, 11:58
Да два. Причём размер файла небольшой, но периодически обрывается на полпути...

Автор: A1ekcandr 6.3.2008, 12:08
мало информации нужен более полный кусок скрипта

Автор: dimcat 6.3.2008, 13:48
Да полнее не придумаешь... Вот дословно:

Код

$file = fopen("http://hotelsandtours.ru/events/hopy2.php","r");
$buf=fread($file, 3000000);
fclose($file);
echo $buf;


Другого кода нет. Сам файл hopy2.php работает нормально... Ну собственно, можете и сами убедиться... Ощущение такое, что всё-таки обрубается всё на каком-то по счёту символе...

Автор: A1ekcandr 6.3.2008, 14:26
обрубается всегда в одном месте после <tr>

а вообще это изврат, почему сразу не написать ?
Код

include(/events/hopy2.php) или require_once(/events/hopy2.php);

ну пути только сами правильно прописать

Добавлено @ 14:37
не рекомендуется открывать и считывать удаленный файл через fopen(http:// и т.д.) и fread() думаю что какраз по таким причинам для удаленного доступа к файлам лучше использовать socket-ы но в вашем случае лучше будет то что я написал выше

Автор: awers 6.3.2008, 15:51
а file_get_content? 

Автор: Feldmarschall 6.3.2008, 17:11
dimcat, следует отличать файлы от НТТР-ресурсов.
И не обращаться к файлам, как к НТТР-реесурсам.

Автор: dimcat 7.3.2008, 11:33
Цитата

а вообще это изврат, почему сразу не написать ?
include(/events/hopy2.php) или require_once(/events/hopy2.php);


Цитата

dimcat, следует отличать файлы от НТТР-ресурсов.
И не обращаться к файлам, как к НТТР-реесурсам.


Потому что это должно быть доступно с любого другого сайта... Как тогда стоит обращаться, знаете?

Код
file_get_content


Что это за функция и как работает? Ни одного толкового описания не нашёл.

Автор: Feldmarschall 7.3.2008, 11:38
набираешь в браузере php.net/ и дальше пишешь имя функции. любой функции PHP.
и сразу тебе толковое описание.

вот только врядли она поможет.

Автор: dimcat 7.3.2008, 11:47
Цитата

вот только врядли она поможет.


Ну да, не понял её преимущества перед file в моём случае.

Ещё такая фишка. Если я оставляю только один блок для вывода, то всё проходит нормально... Вот ё.

Автор: Feldmarschall 7.3.2008, 11:53
что такое блок для вывода? Ещё одна html таблица?

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

Автор: A1ekcandr 7.3.2008, 12:40

Цитата

Потому что это должно быть доступно с любого другого сайта... Как тогда стоит обращаться, знаете?


знаете, знаете. Я уже писал об этом
Цитата

 для удаленного доступа к файлам лучше использовать socket-ы

Автор: Feldmarschall 7.3.2008, 12:44
A1ekcandr, он раздает эти картинки перепродавцам. там не то что сокеты - там и url_fopen_wrapper будет у половины закрыт.

Автор: A1ekcandr 7.3.2008, 13:15
Цитата

он раздает эти картинки перепродавцам. там не то что сокеты - там и url_fopen_wrapper будет у половины закрыт. 

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

Автор: dimcat 7.3.2008, 13:36
Цитата

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


Это вы каким образом пришли к столь однозначному умозаключению?))))

Цитата

думаю что проблема всетаки в его скрипте 


Ну какая проблема может быть в скрипте? Попробуйте отдельно взять подключаемый файл - он же работает без проблем...

http://hotelsandtours.ru/events/hopy2.php

Сюда поключаем: http://hotelsandtours.ru/events/inc.php - дословный код:
Код

<?
$file = fopen("http://hotelsandtours.ru/events/hopy2.php","r");
$buf=fread($file, 3000000);
fclose($file);
echo $buf;
?>


Главный вопрос: Если файл сам по себе работает, то почему он не работает при чтении?

Автор: Feldmarschall 7.3.2008, 13:58
dimcat, твоя логика здесь не работает. Откровенно говоря, её здесь вообще нет.
Из того, что отдельно подключаемый работает, не следует, что проблема не в нем.

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

Автор: MoLeX 7.3.2008, 14:37
dimcat потести http://freebots.1gb.ru/read.php 

Автор: awers 7.3.2008, 15:27
если нужно получить просто данные можно и curl использовать... 

Автор: MoLeX 7.3.2008, 15:34
вылаживаю скрипт, не знаю возможно даже и не пригодится... так на всякий случай...
Код

<?php
class StealText
{
    public function UrlGetContents($url, $timeout = 5)
    {
        $url_parsed = parse_url($url);
        $host = $url_parsed["host"];
    
        if ($url == "" || $host == "") 
        {
            return false;
        }
    
        $hostName = gethostbyname($host);
        $ip = ip2long($hostName);
           
        if ($ip === -1 || $ip === false) 
        {
            return false;
        }
            
        $port = ($url_parsed["port"] == 0 ? 80 : $url_parsed["port"]);
        $path = (empty($url_parsed["path"]) ? "/" : $url_parsed["path"]);
        $path.= (!empty($url_parsed["query"]) ? "?".$url_parsed["query"] : "");
        $out = "GET ".$path." HTTP/1.0\r\nHost: ".$host."\r\nConnection: Close\r\n\r\n";
        $fp = fsockopen($host, $port, $errno, $errstr, intval($timeout));
            
        if (!$fp) 
        {
            return false;
        }
               
        stream_set_timeout($fp, intval($timeout));
        fwrite($fp, $out);
    
        $headers = "";
        $content = "";
        $buf = "";
        $isBody = false;
            
        while (!feof($fp)) 
        {
            $buf = fgets($fp, 1024);
            
            if ($isBody) 
            {
                $content .= $buf;
            } 
            else    
            {
                $headers .= $buf;
            }
                    
            if ($buf == "\r\n") 
            {
                $isBody = true;
            }
        }
               
        preg_match("#HTTP/1.[0-9]{1}\s+([0-9]{3}).*#is", $headers, $match);
        fclose($fp);
        if($match[1] != 200) 
        {
            return false;
        }
               
        return array("headers" => $headers, "body" => $content);
    }
    
    public function ErrorUrl()
    {
        echo "Хм, урл какой то кривой однако.";
    }
    
    public function PrintContents($msg, $Value)
    {
        if($Value == "true")
        {
            echo $msg.str_repeat("<br>", 3)."\n";
        }
    }
    
    public function PrintHeaders($msg, $Value)
    {
        if($Value == "true")
        {
            echo $msg;
        }
    }        
}



$go = new StealText();

if (($HTML = $go->UrlGetContents("http://hotelsandtours.ru/events/hopy2.php")) === false) 
{
    $go->ErrorUrl();
} 
else 
{
    $go->PrintHeaders($HTML["headers"], true);
    $go->PrintContents($HTML["body"], true);
}
?>


если не работает, значит у твоего хостера запрещены сокеты

Автор: dimcat 7.3.2008, 17:12
MoLeX, спасибо огромное... Пусть не универсальное решение, но хотя бы могу предложить тем у кого сокеты не отключены. Кстати, эту настройку делает только сам хостер или есть пользовательские возможности?

Автор: mishaSL 7.3.2008, 17:37
Цитата(dimcat @  7.3.2008,  17:12 Найти цитируемый пост)
Кстати, эту настройку делает только сам хостер или есть пользовательские возможности? 

Если у вас нет доступа в php.ini то только хостер.

Вот вариант для http://forum.vingrad.ru/forum/topic-163191/kw-curl-%D1%81%D0%BE%D0%BA%D0%B5%D1%82%D1%8B-fsockopen.html

Автор: MoLeX 10.3.2008, 09:31
Цитата(dimcat @  7.3.2008,  17:12 Найти цитируемый пост)
но хотя бы могу предложить тем у кого сокеты не отключены.

они отключены в основном тока у бесплатных хостеров и то не у всех, из 5-ти халявных хостингов (котороыми пользуюсь для разных тестов), сокеты отключены тока у одного, и еще у одного подключают по просьбе (типо если он действительно тебе нужен)...


Цитата(dimcat @  7.3.2008,  17:12 Найти цитируемый пост)
Пусть не универсальное решение

хм, а что в твоем виде - универсальное должно быть? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)