Ответы пользователя по тегу PHP
  • В чем разница между getMockBuilder и createMock в PHPUnit?

    Буду ссылаться на официальную документацию:
    1. Функция сreateMock общего назначения, которая мокает объект в соответсвии с лучшими практиками по умолчанию: не вызывается __construct, __clone, __autoload, подменяются все методы. По сути короткий синтаксис для создания мок объектов.
    2. getMockBuilder в свою очередь реализует паттерн Builder и позволяет явно задать состояние мок объекта

    Взгляните на два способа создания одинаковых по поведению мок объектов:
    $mock1 = $this->getMock(MyClass::class, [], [], '', true, false, true);
    $mock2 = $this->getMockBuilder(MyClass::class)
        ->disableOriginalClone()
        ->getMock();

    Использование билдера моков проще по визуальному восприятию в некоторых случаях. Я предпочитаю всегда второй способ из-за легкости чтения.
    Ответ написан
    Комментировать
  • Какие есть варианты вывода изображений с чужого хостинга под видом своего?

    Проксируйте запрос к картинке через свой сервер, на выбор два варианта:
    1. Настраиваете прокси на уровне nginx, если используете его
    2. Настраиваете прокси на стороне PHP: создаете роут вида images/%absolutePathToRemoteImage%, контроллер принимает путь, забираете изображение через
      file_get_contents('http://site.com/' . $absolutePathToRemoteImage)
      и через echo отдаете его пользователю
    Ответ написан
    Комментировать
  • Как ограничить время запроса curl?

    https://github.com/KhristenkoYura/mcurl - примеры использования библиотеки
    https://curl.haxx.se/libcurl/c/CURLOPT_TIMEOUT.html - допустимое время для получения запроса в секундах

    Данной библиотекой не пользовался, но алгоритм такой: устанавливаете опции клиенту, делаете запрос и возвращается объект Result, по которому можно понять, как выполнился запрос.
    $client->setOptions([CURLOPT_TIMEOUT => 5]);
    $result = $client->get('http://example.com');
    
    echo $result->hasError() ? 'ERROR' : $result->getBody();
    Ответ написан
    Комментировать
  • Как сделать парсер файловой системы?

    Могу предложить альтернативное решение через итераторы:
    function iterateDirectory($i)
    {
        /** @var SplFileInfo $path */
        foreach ($i as $path) {
            if ($path->getBasename() === '..') {
                continue;
            }
    
            if ($path->isDir())
            {
                echo $path->getPath() . '<br>';
                iterateDirectory($path);
            }
            else
            {
                echo $path->getPathname() . '</br>';
            }
        }
    }
    
    $dir = '/var/log';
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    
    iterateDirectory($iterator);


    В дальнейшем будет проще дорабатывать фильтрацию и учитывать особенности (например, симлинки)
    Ответ написан
    Комментировать
  • Как определить основы php?

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

    Для изучения можно следовать этому пути: phptherightway.ru
    Ответ написан
    4 комментария
  • Как разобрать такой JSON от Telegra.ph?

    Код ненанежный, но для примера годен.
    function toHtml(array $content) {
        $html = '';
    
        foreach ($content as $row) {
           if (is_string($row)) {
                $html .= $row;
    
                continue;
            }
    
            $attrs = '';
            if (isset($row['attrs'])) {
                foreach ($row['attrs'] as $name => $value) {
                    if ($row['tag'] === 'img') {
                        $value = '//telegra.ph' . $value;
                    }
                    $attrs .= sprintf(' %s="%s"', $name, $value);
                }
            }
    
            $children = '';
            if (isset($row['children'])) {
                $children .= toHtml($row['children']);
            }
    
            $html .= sprintf('<%s%s>%s</%s>', $row['tag'], $attrs, $children, $row['tag']);
        }
    
        return $html;
    }
    
    $content = json_decode(
        file_get_contents('https://api.telegra.ph/getPage/Vozmozhnosti-Telegram-03-30?return_content=true'), 
        true
    );
    
    echo toHtml($content['result']['content']);
    Ответ написан
    1 комментарий
  • Как применить array_count_values для многомерного массива?

    array_count_values в данной задаче неприменим, необходимо написать свое решение: написать функцию обхода массива, которая будет формировать другой массив для ваших целей.
    Ответ написан
    Комментировать
  • Как использовать прокси для парсера Xpath + php?

    Достаточно в мануале поискать все параметры с текстом PROXY.

    Для HTTP прокси достаточно такой настройки:
    curl_setopt($connection, CURLOPT_HTTPPROXYTUNNEL, false);
    curl_setopt($connection, CURLOPT_PROXY, '66.96.200.39:80');
    curl_setopt($connection, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    Ответ написан
    Комментировать
  • Как лучше сделать, чтобы скрипт выполнялся каждую секунду?

    Надежнее и быстрее кроном, т.е. первым способом. Плюс добавить монопольный режим, который будет позволять запускать только один экземпляр.
    Во втором варианте есть один недостаток - нужно навесить менеджер процессов, который будет контроллировать жизнь процесса и поднимать его, если он упал. Плюс необходимо быть уверенным, что скрипт не течет по памяти, а этого достичь не всегда удается (особенно, если достался в наследство "хороший" код).
    Ответ написан