Ответы пользователя по тегу PHP
  • Что почитать, прежде чем писать свой фреймворк на php?

    @Masterme
    Все пых-фреймворки - говно. Чтобы лучше понять, каким должен быть веб-фреймворк, нужно смотреть на фреймворки в других языках, например, на RoR (хотя, он не идеален, конечно). Там люди совсем по-другому мыслили и не были стеснены пых-парадигмой. Также хорош django, отражена суть реакции фреймворка на запрос.

    Чтобы написать фреймворк нужно понять, какие задачи он решает, а значит эти задачи должны в вашей трудовой деятельности возникнуть в достаточно актуальном виде, и не все сразу, а по отдельности. Чтобы вы поняли, какой шаблонизатор лучше и почему, какая модель для работы с данными лучше и почему, какой обработчик событий лучше и почему и т.д.

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

    Ну и не следует забывать, что первый вариант всё равно пойдёт в /dev/null
    Ответ написан
    Комментировать
  • На чем писать сервис сбора статистики?

    @Masterme

    что-нибудь, что не дохнет как php, например python-wsgi или ruby-rack скрипт. в базу записывать в асинхронном режиме. можно не в базу, а в файл. опач, нжынкс или что другое - без разницы

    Ответ написан
    2 комментария
  • Какие юзать курсы по HTML, CSS, PHP для начинающих?

    @Masterme

    Послушайте. Было бы смешно, если бы не было так грустно. Каждый день пачками появляются вопросы где и как научиться программировать. Ладно, я бы понял, если бы спрашивали как обучиться столярному делу или садоводству. Но блин... интернет просто пропитан компьютерной тематикой и, особенно, вебом. Гугл, самоучитель - и понеслась. Но нет же, надо зайти в QA и спросить "как мне выучиться?". Действительно, как же выучиться? Может быть старым испытанным способом: найти руководство, прочитать и выполнить советы? А где найти руководство? В поисковой системе? О, неужели это работает? А как сформулировать запрос? Достаточно вписать то что я хочу получить? Что ж, звучит недурно. Похоже, я и вправду смогу освоить эту хитрую технику. Но она такая сложная... я ведь учусь всего лишь в 10м классе...

    Ответ написан
    6 комментариев
  • Php5.5: The json extension is missing?

    @Masterme

    недавно пробегал похожий вопрос, полистайте. решилось, кажется, установкой отдельного пакета (в бубунте есть)

    Ответ написан
    Комментировать
  • «Срывается» загрузка страницы

    @Masterme
    а ошибки точно в лог пишутся? error_reporting какой? и в тот ли лог? а то пых может писать как в свой лог, так и в лог апача
    сделайте фейл какой-нибудь, например, деление на ноль, и проверьте, отобразится ли это в логе
    Ответ написан
  • Проблема с file_get_contents: failed to open stream: Operation now in progress

    @Masterme
    Для многопоточной загрузки — curl конечно
    Ответ написан
    1 комментарий
  • Второй вопрос к толковым web-разработичкам, знакомым с паттернами

    @Masterme
    здесь я уже писал свои соображения по теме, так что просто дополню:

    нужно правильно обработать ситуацию с пустым массивом $cities, иначе получим ошибку SQL, если в нём 0 элементов — то не включать условие

    class SomeController extends BaseController {
      function search($params){
        $where = array();
        if ($params['tariff']) $where['tariff'] = $params['tariff'];
        if (is_array($params['cities']) and count($params['cities'])) $where['cities'] = $params['cities'];
        $uses = $this->Users->find($where); // массив cities будет автоматически сджойнен
        return compact('users');
      }
    }
    


    лучше сделать $params объектом с интерфейсом ArrayAccess, и на все несуществующие параметры возвращать null

    то что Вы сейчас пишете — это инъекция на инъекции, достаточно в tariff передать что-нибудь вроде ROBIN DROP TABLE `users`…
    Ответ написан
    Комментировать
  • Несколько вопросов к толковым разработчикам относительно mvc и php?

    @Masterme
    Привет.

    Вот так удобно работать с данными:

    Открываем страницу /articles/, либо /articles/123, либо /articles/?date=2013-10-22

    class ArticlesController extends BaseController {
      # для страницы /articles/
      function index ($get_params){
        if ($get_params->date){
          $articles = $this->Articles->find_by_date($get_params->date); // выбираем все статьи за заданную дату
        } else {
          $articles = $this->Articles->all(); // выбираем все статьи из таблицы
        }
        return compact('articles'); // этот массив пойдёт в шаблонизатор
      }
    
      # для /articles/123
      function item($get_params){
        if ($article = $this->Articles->find_first_by_id($get_params->id)){
          return compact('article');
        } else {
          throw new Exception404;
        }
      }
    }
    


    $this->Articles вызывает __get класса BaseController, в нём ленивая загрузка, если первая буква аргумента большая — то модель создаётся на лету. Аналогично, find_by_* и find_first_by_* — обращаются к __call родительской модели и преобразуются в SELECT.

    Ещё примеров.
    Создать пустую запись в таблице
    $this->Article->create();
    


    но обычно создают не пустую, а с данными, потому (в контексте контроллера)
    $article = $this->post('article); // массив
    if ($id = $this->Articles->create($article)){
      $article['id'] = $id;
    }
    
    

    Найти статьи и пользователей, их создавших:
    $articles = $this->Articles->find_by_date('2013-04-15');
    if ($authors_ids = array_map(function($article) {return $article['author_id'];}, $articles)){
      $authors = $this->Authors->find_by_id(array_unique($authors_ids));
    }
    return compact('articles', 'authors');
    

    В модели эти команды преобразуются в
    SELECT * FROM `articles` WHERE `date`='2013-04-15'
    SELECT * FROM `authors` WHERE `id` IN (1, 2, 3, 4, 5);
    if ($authors_ids = ...) — проверка, не пустой ли получится массив

    Чем модель отличается от датасета.
    $article = array('id' => 123, 'title' => 'Зима в деревне!', 'content' => 'Однажды в студёную зимнюю пору лошадка примёрзла ...', 'date' => '2014-06-01', 'author_id' => 1);
    это датасет

    а
    $article = new ArticleModel(array('id' => 123, 'title' => 'Зима в деревне!', 'content' => 'Однажды в студёную зимнюю пору лошадка примёрзла ...', 'date' => '2014-06-01', 'author_id' => 1))
    это модель

    Разница в том, что на модель можно навешать методов и юзать такой синтаксис
    $articles = $this->Articles->all();
    foreach ($articles as $article){
    print $article->author['name'];
    }
    т.е. в этом случае мы прописываем классу ArticleModel метод author, который возвращает значение типа AuthorModel и т.д.

    $article->author->articles; // все статьи автора, написашего данную статью.

    иногда так удобнее, иногда нет. с моей точки зрения разница невелика. я пользуюсь датасетами и примерно таким синтаксисом
    $articles = $this->Articles->find_by_author_id($article['author_id']);
    на один запрос меньше.

    — примечание: есть модель в терминологии MVC, означает программный слой. а есть модель — как объект, соответствующий строке таблицы. я говорил про вторую. а первая модель это
    $this->Articles
    $this->Authors
    Ответ написан
    1 комментарий
  • Как на новый сервер поставить старую версию php (CentOS)

    @Masterme
    Привет.

    Проблема общая, касается не только php, а любого языка в принципе. На продакшне может понадобиться определённая версия интерпретатора, и не из-за квалификации программистов, а по разным причинам, чаще всего это либо legacy, либо разные версии в репозиториях девелоперских машин и продакшна. Поэтому оптимальный выход — компилировать из исходников и на продакшне, и на девелоперской машине. Рубисты это сразу поняли, и у них есть замечательный rvm. Для php самое похожее — это phpfarm. Ничего сверхъестественного, просто удобная автоматизация ручных операций. Возможно, придётся повозиться с зависимостями типа *-devel, т.к. эти ошибки видны только при компиляции php.
    Ответ написан
    1 комментарий