За последние 24 часа нас посетили 17356 программистов и 1720 роботов. Сейчас ищут 936 программистов ...

поблемма с функцией fopen

Тема в разделе "PHP для новичков", создана пользователем alp, 24 мар 2008.

  1. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    Я уже что только не перепробывал перерыл весь этот сайт но ответ так и не нашел.
    проблемма следующая
    есть скрипт
    тита так
    PHP:
    1. ля ля тополя
    2. $i=100+200;
    3. .......;
    4. $fr=fopen('http://....', "rb");
    5. ..........;
    6. $g=10+$i;
    7.  
    Так вот собственно проблемма когда скрипт доходит до строчки с функцией fopen он ждет ответ,
    но иногда работа этой функции занимает время больше 300 секунд, что приводит к отключению скрипта т.к. на сервере стоит ограничение на выполнение скрипта 300 секунд
    вопрос: Как сделать так чтобы скрипт не стопорился на этой функции, а сразу шел дальше по коду и не важно откроит этот файл или нет.
    просто если усет открыть скрипт сделает одно если нет то другое
     
  2. tmanager

    tmanager Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Ответ: организовать многопоточность. Я, увы, не умею этого делать. Начинать копать можно примерно отсюда:
    http://php.net/manual/en/ref.pcntl.html
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если fopen не может открыть данный URL, он выведет сообщение типа:
    Warning: fopen(http://blablabla.ru/bla.php) [function.fopen]: failed to open stream
    Я думаю, проблема в другом.
    В прицнипе можешь поппробывать так:
    PHP:
    1. <?
    2. ....
    3. if($fp=fopen(...))
    4. {
    5.  ....
    6. }
    7. else
    8. {
    9. что-то другое
    10. }
    Чтобы продлить время работы скрипт, в начале скрипта добавь:
    set_time_limit(секунды);
    0 секунд = неограничено.
     
  4. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    я уже такое делал
    он дойдет до строчки
    if($fp=fopen(...))
    и встанет
     
  5. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
  6. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    пишет
    Warning: fsockopen() [function.fsockopen]: unable to connect to http://......../ope.php?from=1258:80 (Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?)

    что делать не пойму?
     
  7. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    и не происходит то что нужно
     
  8. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    читать мануал
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    alp

    покажи РЕАЛЬНУЮ ссылку. нам тут всем скрывать нечего.
     
  10. Anonymous

    Anonymous Guest

    Врапперы отключены.
     
  11. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    alp
    В fsockopen первым параметром передают ip или домен, вторым параметром - порт. А у Вас как? URL?
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а они доки не читают. зачем. они думают, наверное, что можно еще и так сделать

    $fp = fopen('http://...',"w");

    и будут долго удивляться пАчиму не работает...
     
  13. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    в данный момент я использую так
    @fopen('http://.......ru/ope.php?from='.$fnf.'&tof='.$fnt, "rb");
    и все работает
    только виснет так как время работы сприпта ope.php занимает много времени вот и виснит
    а суть вопроса как заставить работать скрипт ope.php и продолжить работу скрипта вызвавшего работу ope.php дальше
    p/s/ скрипт ope.php может очень долго выполнять свои функции и ограничения по времени его работы нет но есть ограничения у скриптов которые его вызывают
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    alp
    Попробуй так: $fp=fsockopen('www.site.ru/ope.php?from='.$fnf.'&tof='.$fnt,80,$errno,$errstr,10);
    Здесь 10 - таймаут в секундах на выполнение операции.
     
  15. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    alp
    используйте кеш и/или подгружайте эти данные через ajax
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ti
    Дык хоть через аякс - это он только в браузере не заметит времени обработки, а скрипт то застопорится.
     
  17. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    Пробывал пишет
    Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: getaddrinfo failed: No such host is known. in .....
    Warning: fsockopen() [function.fsockopen]: unable to connect to www........ru/ope.php?from=ppppppp:80 (Unknown error)
     
  18. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    сокету надо передать имя хоста а не URL
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    RTFM! Ламерство не знает границ.
    Последний раз отвечаю в тему, потом буду посылать к мануалу.
    PHP:
    1. <?php
    2. $get="GET /ope.php?from=$fnf&tof=$fnt HTTP/1.0\n\rHost: [url=http://www.site.ru]www.site.ru[/url]\n\r\n\r"; //Формируем GET-запрос
    3. $fp=fsockopen('www.site.ru',80); //Открываем сокет
    4. socket_set_timeout($fp,100,0); //Назначаем таймаут (100 - это секунды)
    5. fwrite ($fp,$get); //Отправляем GET-запрос
    6. if(fread($fp,1)) //Если получили какой-то ответ до истечения тайм-аута
    7. {
    8.     print 'Скрипт выполнился';
    9. }
    10. else
    11. {
    12.     print 'Таймаут истек!';
    13. }
    14. ?>
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    О_о Я чето спутал видимо =)
     
  21. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    думай и проверяй прежде чем писать.
     
  22. Anonymous

    Anonymous Guest

    плакаю пацталом...
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Злые вы... не уйду я от вас >:eek:
     
  24. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    А запрос то в этом коде не повылает
    ?from=$fnf&tof=$fnt
     
  25. alp

    alp Активный пользователь

    С нами с:
    15 мар 2007
    Сообщения:
    85
    Симпатии:
    0
    как я писал ранее смысол даже не втом чтобы прочитать или записать в этот файл (ope.php) что то
    задача состоит втом чтобы запустить скрипт ope.php с параметраме а функция fopen используеться лишь по этой причине