Ответы пользователя по тегу PHP
  • PHP: очень медленно работает echo

    @galaxy
    АПД2: Если запустить скрипт из консоли — выполняется 2.2 сек (в скрипте одно большое echo). А если перенаправить вывод в /dev/null, а microtime в error_log — то выполняется 0.003 сек

    Это сеть (скорее всего, ssh канал между вами и сервером). Пример:

    > time cat [текстовый лог на 1.3М]
    real 0m52.905s
    user 0m0.000s
    sys 0m0.012s

    > time cat [тот же файл] > log.txt
    real 0m0.015s
    user 0m0.000s
    sys 0m0.004s

    Что касается веб-сервера, время может уходить на резолвинг (как указали выше), маршрутизацию/нат/свичинг собственно в локалке, соединение + плюс TCP некоторое время (точнее, несколько пакетов туда-обратно) нужно, чтобы выйти на полную скорость.
    Последовательно отсеивайте причины: nslookup или скачивание напрямую по IP (DNS), ping (скорость пакетов по локалке, потери пакетов), tcpdump — универсальный инструмент, смотрим, что когда и как отдается.
    Ответ написан
    Комментировать
  • Прием потока данных через TCP сокет на PHP?

    @galaxy
    Вы что-то не то делаете с сокетами.
    FIN_WAIT_1 говорит о том, что ваш сервер соединение закрыл со своей стороны и ждет закрытия со стороны клиента. Имхо, происходит такое потому, что, сделав socket_read(), вы делаете socket_accept() следующему соединению, переменная $client (предыдущий сокет) попадает в сборщик мусора, который пытается корректно завершить соединение. Нельзя так выбрасывать заакцепченный сокет, надо продолжать пытаться читать из него данные, одновременно проверяя, нет ли новых запросов на соединение. Можно организовать это и через sleep'ы, но классический подход состоит в использовании socket_select(). Следуя вашему подходу, можно написать что-то в этом духе:
    while(1) {
      usleep(100000);
      if((time()-$time) >= 60) { $time = time(); UpdatePID($pid); }
      $client = @socket_accept($socket);
      if($client) {
        $clients[] = $client;
      }
      foreach($clients as $i => $c) {
        $data = socket_read($client, 4096);
        if ($data === false) { // error or closed connection
          socket_close($c);
          unset($clients[$i]);
        } elseif (strlen($data)) {
          Save2DB(trim($data));
        }
      }
    
      ...
    
    Ответ написан
  • php SOAP Extension

    @galaxy
    Блин, господа пхп-программеры, научитесь пользоваться собственными инструментами разработки.

    $client = new SoapClient(
      'http://new.starliner.ru/modules/trains/soap/test.wsdl',
      array(
        'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
        'trace' => 1
      )
    );
    
    try {
      $result = $client->trainRoute(array('day'=>'12', 'month' => '12', 'train' => '066А'));
    } catch (Exception $e) {
      print $e->getMessage() ."\n";
    
      print $client->__getLastRequest();
    
      print $client->__getLastResponse();
    }
    


    Wrong Version
    
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:Ufs" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:TrainRoute><from xsi:type="ns1:ufsTrainRoute"><day xsi:type="xsd:string">12</day><month xsi:type="xsd:string">12</month><train xsi:type="xsd:string">066А</train></from></ns1:TrainRoute></SOAP-ENV:Body></SOAP-ENV:Envelope>
    
    
    
    
                <html>
                    <body>
                        <pre style="border: 1px solid black; padding: 8px; background-color: whitesmoke;">
                            Ошибка 5027: Starliner: Метод "test" в контроллере "SOAP" не найден
                        </pre>
                    </body>
                </html>
    
    

    Ответ написан
    Комментировать