Ответы пользователя по тегу PHP
  • Влияют ли комментарии и количество строк на скорость загрузки файла?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Но так как файл каждый раз читается интерпретатором (упустим кэширование) то должно быть он тратит какую то доли секунду на пробежку по комментариям.

    Да, но нет. Предполагается, что PHP-код работает в *nix/Linux среде. Linux, не настолько глупая ОС, что бы позволить себе такую роскошь, как дёргать с жесткого диска каждый раз, как он Вам понадобился. Часто запрашиваемые файлы хранятся в оперативной памяти либо, в буфере самого жесткого диска. Соответственно затраты на чтение самого файла - довольно минималистичны, это наносекунды на чтение мегабайтов кода и файлов.

    Далее, файл начинает "парсится", т.е. читаться интерпретатором. На этом этапе мы потеряем ещё несколько нано-секунд на чтение нескольких десятков/сотне/тысяч строк с комментариями (которые надо заметить, как таковыми комментариями не всегда являются, в PHP-фреймворке Symfony 2 и 3 - комментарии являются разновидностью управляющих конструкций, в т.ч. в них могут быть записаны роуты, связи и прочие дела. Аналогичные практики есть так же в C#/ASP.NET и в других фреймворках/технологиях).

    Далее, в PHP (как и во многих других интерпретируемых языках, включая Java, C#, Python и другие) есть такая штука, которая компилирует Ваш файл в байт-код, удаляя оттуда всё, что когда-то было комментариями и прочими штуками, нужными для "человеко-понятности" и превращает Ваш исходный код в бинарный файл. В некоторых случаях, это может быть просто высоко-оптимизированный код, в некоторых случаях это может быть сразу машинный код (для процессора).

    Например, Opcache (*по этой ссылке так же ответ на Ваш вопрос) уже поставляется "искаропки" с версии PHP 5.5, а в PHP 7.0 ещё и производительность интерпретатора возросла примерно в 2 раза (но это не мешает многим и многим проектам работать на PHP ветки 5.х).

    А ещё есть HHVM довольно специфическая штука, которая, насколько я помню, конвертирует PHP-код в C/C++ код, а потом компилирует его, за счёт этого производительность увеличивается иногда в разы. Вещь специфическая, и любимый блог "о прогулках с собакой" на WordPress'е запустить на нем так вот сходу - вряд ли получиться, но если стоит цель оптимизировать всё и всё - возможно HHVM станет отличным решением.

    Так же Вы можете посмотреть в сторону мега-популярного на просторах бывшего СССР CMS/Фреймворка по имени "1с Битрикс", если обратить внимание на скорость его работы и ряд других особенностей, в т.ч. необходимость настройки сервера таким образом, что кроме Битрикса там уже почти ничего не работает + он не поддерживает PHP версии выше 5.6 (хотя вот уже с год они пытаются перевести его на ветку 7.х) + он аццки тормозной, генерирует тонны запросов по поводу и без него и так далее... Но это не мешает ему прекрасно жить и развиваться и продаваться и ещё красоваться на сайтах некоторых ведущих в своей области компаний, в частности "Эльдорадо" и если мне не изменяет память - "М.Видео", ну и многих других, например "ТеремПро".

    Подводя итог, хочу Вам посоветовать не забивать голову всякой ерундой на тему оптимизации кода путем вычистки оттуда комментариев... при том уровне оптимизации, о котором Вы говорите - код пишут на чистом Си, а не на PHP. И, в продолжение банкета, вот Вам пример кода из документации по Symfony:
    /**
     * @Route("/blog/{date}/{slug}/comments/{comment_slug}")
     * @ParamConverter("post", options={"mapping": {"date": "date", "slug": "slug"}})
     * @ParamConverter("comment", options={"mapping": {"comment_slug": "slug"}})
     */
    public function showCommentAction(Post $post, Comment $comment)
    {
    }


    Здесь комментарий несёт не информационно-смысловую, а непосредственно логическо-кодовую нагрузку. Подумайте, что будет если его удалить?

    *подсказка - код перестанет работать должным образом! :)

    ----------

    И ещё такой момент, есть ли смысл ставить дополнительные переносы строк и обязательно ли переносить открывающуюся фигурную скобку на новую строку?

    За Вас всю эту работу сделает IDE. Возьмите PHPStorm или NetBeans, среди прочих, они так же отлично подходят для написания кода, в т.ч. PHP-кода. На счёт NetBeans не скажу, но PHPStrorm точно умеет подстраивать код под стандарты PSR (о которых Вам писали выше), рекомендую ознакомиться со всеми из них, их не так много. А потом, настроить IDE на то, что бы она автоматически форматировала код. В NetBeans (и PHPStorm при выборе раскладки NetBeans) - это клавиши Alt+Shift+F. НО! самое главное, какой бы Вы стандарт не выбрали, хоть свой собственный - придерживайтесь его в течение всего проекта и не отступайте от него, проект должен быть написан в едином стиле! Это важно.
    Ответ написан
    3 комментария
  • PHP фреймворк для начинающего разработчика?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Фреймворков в целом, которые достигли должного уровня популярности и народного признания - не так уж много (если говорить о PHP-фреймворках).

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

    После этого фреймворка, промежуточным, можно было бы считать Kohana, но, он что-то то "умирает", то снова "воскресает"... С документацией на него, по моему, всё так же плохо (читай "не очень хорошо") как и всегда... но, по нему есть несколько неплохих видео-уроков.

    Суда же можно отнести Yii, на мой взгляд, он застрял где-то между "большими" и "маленькими" фреймворками. Маленьким его уже не назовёшь, по ряду признаков, а до большого и целостного - он ещё не дотягивает. Но, он довольно популярен на просторах бывшего СССР (по понятным для многих причинам), в виду чего имеет довольно большое русскоговорящее сообщество и целую толпу ярых фанатов.

    Далее, в обязательном порядке будет идти Laravel - превосходная документация, примеры и фантастическое количество видео-уроков (если хорошо понимаете английский). Отличный фреймворк собранный на базе Symfony. Относится уже к "большим".

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

    P.S. Я понимаю, что Вы спрашивали "какой фреймворк учить первым?", а не какие они бывают вообще. Но, дабы предостеречь Вам от вопросов типа "какой фреймворк учить вторым?" или "почему Symfony в роли первого фреймворка так тяжело изучать?" и массы прочих подобных - озвучил одни из самых популярных фреймворков в мире веб-разработок в ракурсе PHP.
    Ответ написан
    1 комментарий
  • Как исправить глюки с SELECT MAX(`id`)?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Не уверен, что это 100% поможет, не проверял логику работы этой функции, но попробовать стоит:
    SELECT * FROM you_table WHERE id = LAST_INSERT_ID();


    Иначе говоря:
    SELECT LAST_INSERT_ID();

    *Сразу не заметил... Но после с автоинкрементом лишним не будет.
    Ответ написан
    2 комментария
  • Как сделать abort для PHP страницы по отношению к AJAX-запросу?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    На самом деле, скрипт будет работать до тех пор, пока не выполнится целиком или пока не достигнет max_execution_time (параметр в php.ini), обычно он равен 30 секундам, но при возможности доступа к php.ini вы можете выставить это время вплоть до бесконечности. Если PHP запущен из консоли - этот параметр не действует, но это не Ваш случай. А то, что вы подразумеваете под "концом страницы" - не более чем сброс буфера, но не стоит забывать, что на веб-сервере может быть свой буфер, который возможно тоже придётся настроить, что бы сервер не "висел" в ожидании.

    То есть алгоритм такой, вы запускаете скрипт, как следствие AJAX-запроса, отправляете в вывод данные, которые Вам нужны (через print/echo), когда последняя порция данных отправлена - делаете flush(), и... скрипт продолжает работать дальше.

    Так же, буфер автоматически сбрасывается (отправляется в браузер и/или промежуточный сервер) при завершении работы скрипта, именно по этому "конец работы скрипта" у Вас ассоциируется с "концом страницы".
    Ответ написан
    6 комментариев
  • PHP 7: не удаётся подключиться к FTP-серверу извне. В чём неправ?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Неплохо бы увидеть лог с ошибками сервера или непосредственно скрипта...

    Если же указываю в качестве адреса 192.168.0.1 или 127.0.0.1, то прекрасно заходит. В PHP5-FPM подключалось. В чём может быть дело?

    Скорее всего, дело в том, что либо "адрес вроде myftpsite.com" не указывается на IP: 192.168.0.1 или 127.0.0.1, либо, скрипт не может сопоставить адрес с IP'шником. Проверить это Вы можете открыв командную строку и написав туда следующую команду:
    ping myftpsite.com

    Если увидите, что пинг пытается обратится на IP 192.168.01 или 127.0.0.1 - значит, скрипт не может сопоставить домен с адресом. Если же там будет какой-то другой IP - то, Вы пытаетесь подключиться не к тому ФТП-серверу, который расположен по адресу 192.168.0.1. Что бы локально прописать сопоставление адреса (домена) IP'шнику - можно отредактировать файл C:\Windows\System32\drivers\etc\hosts
    Ответ написан
    Комментировать
  • Как эффективно построить инфраструктуру для веб сервиса с периодическим "хайлодом"?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Вариант 1. Использовать Varnish, для ресурсов формата "новостник", по моему идеальное решение (в версии 5.0 в зачаточном состоянии появилась поддержка HTTPv2/SSL, судя по ChangeLog).

    Вариант 2. Использовать Nginx + балансировку нагрузки.

    Вариант 3. По быстрому склепать или арендовать облако, где бы ресурсы выделялись динамически, по наиболее оптимальным для Вас алгоритмам.
    Ответ написан
    Комментировать
  • Как сделать проверку ячейки массива на соответствие условиям?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    foreach($Array as $v) {
        if ($v->model == 'iphone 4 4s') {
            // Код выполняется
        } else {
            //Ничего не происходит
        }
    }
    Ответ написан
  • Синтаксис php. Как объединить 2 строчки выражения в одну?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Подозреваю, что вот так:
    echo myFunc()->var()->var;
    Ответ написан
  • Как вывести запись из БД?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    В целом Вам уже предложили верное (по крайней мере, логически верное) решение. Но лично я вижу у Вас два ключевых момента:

    1. Зачем Вам получать данные из базы, которые только что, туда же и записали? Тем более, таким, относительно извращенным образом, и тем более в 2 запроса (запрос + вложенный запрос). Если нужно получить последнюю запись из базы, достаточно сделать запрос типа:
    SELECT * FROM table ORDER BY id DESC LIMIT 1;
    Так мы получим последнюю запись, причем не ту, которую мы туда вставили, а ту, которая физически будет последней на момент выполнения запроса, что полностью аналогично Вашему варианту, но в 1 запрос (без подзапросов).

    Есть ещё вариант запроса, в один запрос:
    SELECT * FROM table WHERE id = LAST_INSERT_ID();
    По этому варианту, не могу точно сказать что мы получим, последнюю существующая запись в БД на момент выполнения запроса, или конкретно последнюю вставленную нами запись в БД... но работает он точно не хуже Вашего примера :)

    1.1. Почему бы нам сразу не выводить те данные, которые мы только что записали в БД? Ведь это как раз те же самые данные, которые нам и нужны, но они уже получены.

    2. Обычно, в такой ситуации, приводят вывод var_dump() (или аналогичной функции), что бы понять, почему именно данные не выводятся. А что бы это понять, нужно сначала выяснить, что у нас в переменной вообще... по крайней мере, это может помочь другим разработчикам, а Вы сможете более точно сформулировать вопрос, например, "ожидалось, что в результате будет скалярный тип - а там почему-то курсор результата запроса из БД". То есть,
    <?php
    var_dump($result);
    //вместо
    echo $result;

    - сильно облегчит решение подобных задач в будущем.
    Ответ написан
    1 комментарий
  • Загрузка кода страницы и исполнение JS с изменением HTML-кода на php. Есть готовые решения?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Вы же понимаете, что для того, что бы выполнить JS-код в PHP, нужно JS-движок либо написанный на самом PHP, либо в него встраиваемый. Вариант движка JS написанного целиком на PHP - я не рассматриваю вообще, так как это был бы полный маразм и с точки зрения трудозатрат и с точки зрения производительности и конечного результата. Соответственно, остаётся вариант - использовать решение которые бы в PHP встраивалось... но, такое решение с вероятностью 99% не будет доступно на виртуальном хостинге, но его можно установить на локальный VPS или выделенный сервер.

    Одним из наиболее популярных JS-движков является V8, вырезанный из Google Chrome, в частности, есть его реализация для PHP, наверняка кто-нибудь уже попытался написать что-то подобное (скрестить PHP и JavaScript, что бы получить некое подобие браузера)...

    Но я бы пожалуй, попробовал начать с каких-то более простых (в реализации) вариантов, в частности, поискал бы команды и/или плагины для браузера, которые бы позволяли сохранить код страницы целиком в HTML-файл, управляясь при этом из командной строки, или попробовал бы написать скрипт для браузера (на JS), который бы вставлялся в конец страницы (например, с помощью простейшего прокси, который можно написать на том же PHP или поковыряться с Nginx/Apache), забирал бы текущий HTML-код прямо из браузера, после его изменений и отправлял бы его в готовом виде на PHP-скрипт, который бы после парсинга выдавал адрес следующей страницы в тот же скрипт, и так до бесконечности (или пока нужные страницы не кончатся).
    Ответ написан
    Комментировать
  • Как сделать редирект на русскую и английскую версию сайта?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Среди прочего, браузер обычно сам выдаёт набор предпочитаемых пользователем языков, практически готовое решение + список "русскоговорящих" языков есть тут. Но если очень хочется именно по IP и/или браузер не прислал набор предпочитаемых языков (*я бы в этом случае просто перекинул на EN), то можно воспользоваться готовым решением для PHP.
    Ответ написан
    Комментировать
  • Как правильно проверить истечение платной подписки пользователя?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Всё зависит от того, как построена логика Вашего приложения или сайта. +1 запрос (а скорее даже не запрос, а доп. условие на что-то), вида:
    SELECT IF ((NOW() + INTERVAL 15 DAY) > row_date_value, 'that', 'then') AS result

    -- особых проблем не добавит, такие расчёты на уровне БД ведутся довольно быстро, к тому же, как можно заметить, в этом примере нет обращения к таблицам непосредственно, мы берём уже заранее готовое (полученное) значение.

    Но, с другой стороны, контролировать логику работы на уровне БД, пожалуй не самое практичное решение. В 99% случаев, есть более правильные механизмы реализованные на уровне фреймворка, так же как например, авторизация. Вы же не проверяете можно ли пользователю создавать запись новостей на сайте, на уровне БД?

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

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

    Если вопрос состоит в том, как лучше сверять даты на уровне "контроллера" (или чего-то ему аналогичного) - Вы можете перевести дату в число Unix-timestamp и сравнивать два числа, быстро и удобно.
    Ответ написан
    Комментировать
  • Как сделать якорь в меню Wayfinder?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Если мне не изменяет память, изначально в Wayfinder подобный функционал не предусмотрен, по этому вариантов не очень много: либо переписать Wayfinder таким образом, что бы он определял якорь по какому-то признаку, либо, корректировать шаблоны вывода меню соответствующим образом.
    Ответ написан
    Комментировать
  • Можно ли портировать адаптивный сайт в приложение?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    Зависит от того, чего Вы хотите добиться. Есть ряд решений, когда сайт упаковывается вместе с сервером и базой и собирается в "единый EXE'шник" (неоднократно встречал подобные реализации для разнообразных оффлайн-справочников), есть вариации с Node.JS/Apache Cordova, можно в ваше приложение встроить компонент "Веб-браузер" (который обычно поставляется с большинством библиотек для построения интерфейсов) и загрузить Ваш сайт в него...
    Ответ написан
    Комментировать
  • Как вывести номер строки но не id?

    Wolfnsex
    @Wolfnsex Куратор тега PHP
    Если не хочешь быть первым - не вставай в очередь!
    $count++; // нужно ставить перед $res_array
    $res_array[$count] = $row;

    Вот эту строку можно сократить до
    $res_array[] = $row;

    PHP сам пронумерует индексы массива, начиная с нуля и выше, соответственно. Единственное, что меня смущает, переменные $res_array и $count не объявлены до их использования.

    Далее, Вы можете выводить слайды с их номерами, основываясь на индексе массива, или без него (если индексы не числовые или их нумерация сбита), одним из вариантов:

    1. По индексу (ключу) массива:
    foreach($res_array as $k => $v) {
        print $k.'<br/>'; //Ключ (индекс) массива
    }


    2. Игнорируя индекс (ключ) массива:
    for($i = 0; $i < count($res_array); $i++) {
        print $i; //индекс
    }


    Вы так же можете модифицировать примеры для своего удобства, если нужна нумерация, например с единицы.
    Ответ написан
    Комментировать