Ответы пользователя по тегу PHP
  • PHP: Один объект может создаваться из многих других, где правильнее размещать фабрики ?

    @sashok1337
    Насколько я понял, у Video есть некоторое кол-во полей, которые заполняются независимо от типа объекта (News, Post или Episode). Если это так - то достаточно только проследить за тем, чтоб классы имели одинаковые название полей(title, picture_id), необходимых для создания объекта типа Video. Это можно сделать, например, используя абстрактный класс либо интерфейс.
    Выйдет примерно следующее:
    Class News {
       public function createVideo($entity)  {
           $video = new Video;
           $video->title = $entity->title;
           $video->picture_id = $entity->picture_id;
           $video->save();
     
           $link = new News_Video;
           $link->news_id = $this->id;
           $link->video_id = $video->id;
           $link->save();
     
           return $video;
      }
    }


    Если же там какая-то кастомная логика для каждого класса - можно её в swich запихнуть.
    Ответ написан
  • Как парсить почту Украины?

    @sashok1337
    Недавно на своём личном трекере посылок тоже обнаружил эту проблему. Там теперь используется какая-то хитрая система с редиректами.

    В итоге решил проще - там есть отслеживание треков из файла (до 200т шт). Я эмулирую отправку файла, в который записываю все треки, и потом парсером вытягиваю из таблицу нужные значения.

    Вот код (php, YII):
    protected static $apiURL = 'http://services.ukrposhta.com/barcodestatistic/Default.aspx';
    
        public static function updateTrackingInfo($sendEmail = false) {
            Yii::import('application.lib.simpleHtmlDom.*');
    
            $packages = Tracking::model()->findAll();
            if (empty($packages)) {
                return;
            }
    
            $ttns = array();
            $ttnsObj = array();
            foreach ($packages as $package) {
                $ttns[] = $package->tr_num;
                $ttnsObj[$package->tr_num] = $package;
            }
    
            $result = self::uploadTTNs($ttns);
            
            if(empty($result)){
              return;
            }
            
            $html = new simple_html_dom();
            $html->load($result);
            $rows = $html->find('#ctl00_centerContent_ListBarcodes tr');
            foreach ($rows as $row) {
                $trackNum = trim($row->find('td', 0)->plaintext);
                $package = $ttnsObj[$trackNum];
                if (!empty($trackNum) && !empty($package)) {
                    $status = trim($row->find('td', 3)->plaintext);
    
                    if ($status !== $package->last_status) {
                        $package->last_status = $status;
                        $package->last_update = time();
                        $package->notified = 0;
                    }
                    
                    $package->save();
                }
            }        
        }
    
        public static function uploadTTNs($ttns) {
            if (0 === count($ttns))
                return FALSE;
    
            $fields = array(
                '__VIEWSTATE' => array(
                    'content' => ''
                ),
                'ctl00$centerContent$btnUpload' => array(
                    'content' => 'Пошук'
                ),
                'ctl00$centerContent$fileUploadXmlBarcodes' => array(
                    'filename' => 'ttn.txt',
                    'type' => 'text/plain',
                    'content' => implode("\r\n", $ttns)
                ),
            );
    
            $data = '';
            $delimiter = '-------------' . uniqid();
    
            foreach ($fields as $name => $field) {
                $data .= "--" . $delimiter . "\r\n";
    
                $data .= 'Content-Disposition: form-data; name="' . $name . '"';
    
                if (!empty($field['filename'])) {
                    $data.= '; filename="' . $field['filename'] . '"' . "\r\n";
                    $data .= 'Content-Type: ' . $field['type'];
                }
                $data .= "\r\n\r\n";
    
                $data .= $field['content'] . "\r\n";
            }
            $data .= "--" . $delimiter . "--\r\n";
    
            $handle = curl_init(self::$apiURL);
    
            $options = array(
                CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
                CURLOPT_POST => true,
                CURLOPT_RETURNTRANSFER => true,
                CURLOPT_POSTFIELDS => $data,
                CURLOPT_HTTPHEADER => array(
                    'Content-Type: multipart/form-data; boundary=' . $delimiter,
                    'Content-Length: ' . strlen($data))
            );
            curl_setopt_array($handle, $options);
    
            $result = curl_exec($handle);
            curl_close($handle);
    
            return $result;
        }
    Ответ написан
    7 комментариев
  • Почему на продакшене обрываются соединения с WebSocket сервером при отсылке с него "пакета" больше чем 4кб?

    @sashok1337 Автор вопроса
    Веб сервер Nginx, но нет никакой разницы, т.к. phpDaemon сам является "веб сервером" (через libevent).
    Ответ написан