Задать вопрос
Ответы пользователя по тегу PHP
  • Как создавать миграцию SQL с Git коммитом?

    copist
    @copist
    Empower people to give
    На примере фреймворка Yii
    www.yiiframework.com/doc/guide/1.1/ru/database.mig...
    www.yiiframework.com/doc-2.0/guide-db-migrations.html
    www.youtube.com/watch?v=cugnRoZ1ick&feature=youtu.be

    Миграции - это классы на PHP. Они размещаются в git.
    Класс миграций содержит метод для апгрейда (наката) и даунгрейта (отката) изменений.

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

    Можно попросить отменить (откатить) изменение или установить его ещё раз.

    В миграции можно и структуру таблица поменять (миграция модели), и данные изменить (миграция данных).

    У нас в скрипте установки (на тостере: Какой workflow front-end разработки у вас? ) делается бакап базы перед обновлением и после обновления. Есть ручной скрипт отката, чтобы базу восстанавить.
    А в идеальном случае надо постараться так написать код, чтобы он мог без сбоев работать и с старой, и с новой моделью базы.
    Ответ написан
    Комментировать
  • Как расшаривать куски кода в команде?

    copist
    @copist
    Empower people to give
    Хочу тоже самое но в вебе, для возможности быстрого поиска кодовых полезняшек всей командой и только командой, т.е. доступ только авторизованным.


    Stackoverflow + google ? Много, обо всём, актуальное. Можно искать.
    Ответ написан
  • Как сказать по-русски слово yield???

    copist
    @copist
    Empower people to give
    А ты все слова пытаешься перевести?

    abstract class A extend B interface C
    {
      private property $b;
      final protected function x() { return new static; }
    }


    абстрактный класс А, сын Бэ и лицом-похож-на Цэ
    {
       частная собственность $бэ;
       конченная защищаемая функция икс() { вернуть новую неподвижность }
    }


    Моё частное мнение - достаточно знать, как работает языковая конструкция и в идеале знать, как правильно произносится на английском. Мне лично моё произношение и исковерканные "привАт" "пэхапэ" "пропертЯ" "абстрАкт", "на сях", "си шарп", "" - были до лампочки, пока не пришлось объяснять свой код в команде из англоговорящих программистов и задавать им вопросы по их коду. А ещё я общался с тайцами и индусами и теперь тщательно произношу именно английские версии всех названий технологий, зарезервированных слов и торговых марок. Зиракс, МАйкроСофт, ЭйчТиЭмЭль, ПиЭйчПи, прАйвит, Эбстракт :)
    Ответ написан
    6 комментариев
  • Хочу поднять debian сервер для разработки. Как?

    copist
    @copist
    Empower people to give
    virtualbox.org + vagrantup.com + rove.io

    • Установить Virtualbox
    • Установить Vagrant
    • Cконфигурить на rove.io, получить vagrantfile и сценарий для авто-установки софта

    vagrant up

    Правда всё будет на Ubuntu 12.04, но это почти как Debian ;)
    Ответ написан
    2 комментария
  • Будут ли индексироваться страницы построенные на MVC?

    copist
    @copist
    Empower people to give
    1. Как поисковики находят страницы твоего сайта
    Поисковики сканируют все страницы, на которые он нашёл гиперссылки где-либо.
    Гиперссылки могут размещаться где угодно.
    • Внутренние перекрёстные гиперссылки на твоём сайте. Одна страница ссылается на другую. Для этого делают меню навигации, поиск по сайту, коллеции ссылок по теме, коллеции по тегам, коллеции по категориям, коллеции по датам, коллекции по полулярности и другие способы: take.ms/7GsUX
    • На чужом сайте. Это называется входящие ссылки. Например, я могу вставить ссылку на свой блог здесь на тостере и поисковая система через некоторое время найдёт эту страницу
    • Через карты сайта в формате Sitemap. Почитай сам.
    • Ищи информацию по фразам "SEO" и "Поисковая оптимизация".


    2. Почему поисковая система по запросу "город1" может выдать страницу твоего сайта
    Если на странице твоего сайта есть текст, как-то связанный с поисковой фразой, то есть "город1", то она появится в результатах поиска на яндексе или гугле.

    <html>
    <head>
        <title>город1</title>
    </head>
    <body>
        <h1>город1</h1>
        <p>Этот город1 самый лучший город1 на земле</p>
    </body>
    </html>


    Ищи информацию по фразам "SEO" и "Поисковая оптимизация".
    Ответ написан
    5 комментариев
  • Как отправить put запрос через curl в виде "PUT http://domain/folder/file.php HTTP/1.1"?

    copist
    @copist
    Empower people to give
    Потестируй на своём собственном веб-сервере. Создай страницу, которая будет просто вываливать все заголовки запроса

    <?php
    var_dump($_SERVER);


    Добейся, чтобы в твоём запросе были все указанные заголовки

    Нужные заголовки добавляются в запрос отдельными командами
    $headers = array(
        /* условно, добавить/удалить при необходимости */
        'date' => '2015-08-28T09:41:49+04:00',
        'content-length' => '198284',
        'content-md5' => 'ea200caec1ed9ef712fddafe4e2361e4',
        'x-upload-filename' => 'file_name.ext',
    );
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);


    Знаю, что PUT запрос лучше отправлять по другому:
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT'); // вместо curl_setopt($ch, CURLOPT_PUT, true);
    // и обязательно заголовок передать array('content-length' => 'число байт в файле')
    Ответ написан
  • Какие методы/библиотеки/технологии использовать в web-проекте?

    copist
    @copist
    Empower people to give
    Общий ответ: вебсокеты и асинхронные сообщения через pub/sub
    В гугле искать по фразам "socket.io rabitmq" "php rabbitmq" "php websocket" "php pub/sub"

    Вариант реализации с использованием PHP
    На клиентском приложении: socket.io + javascript
    На сервере: socket.io + RabbitMQ + PHP

    Чтобы следить за игровым процессом:
    Скрипт PHP будет посылать сообщения в очередь на RabbitMQ
    socket.io будет читать очередь RabbitMQ и пересылать в веб-сокеты

    Клиентское приложение в браузере будет создавать постоянное соединение к сервером по протоколу веб-сокетов и читать из него всё, что пришлёт сервер socket.io. Всё, что присылается, нужно будет показывать в веб-интерфейсе.

    Чтобы управлять игровым процессом
    Из клиентской части веб-приложения нужно будет отправлять команды управления через AJAX или через то же соединение веб-сокет.
    В случае "через AJAX" нужно будет создать серверное микро-приложение, которое будет принимать команды через AJAX и затем передавать в основной игровой процесс через RabbitMQ или иным способом.
    В случае "через веб-сокет" серверная сторона socket.io должна будет отрабатывать полученные команды и передавать в основной игровой процесс через RabbitMQ или иным способом.

    На сервере нужно будет периодически делать дамп состояния основного серверного игрового процесса и сохранять в какую-нибудь базу. Я бы предложил дамп хранить в формате JSON в базе NoSQL, например, Mongo, CouchDB, Redis.
    При перезапуске основного серверного игрового процесса нужно будет восстанавливать состояние из этого дампа.

    Игрокам нужно будет выполнять авторизацию. У нескольких игроков может быть один игровой мир или отдельный микро-мир на несколько пользователей или на отдельный сеанс игры (например, одна шахматная доска на двух игроков и несколько зрителей). Поэтому надо будет хранить данные о пользователях и мирах. Вот тут подойдёт SQL база, например, MySQL или PostgreSQL. Хотя и NoSQL тоже можно использовать.

    Ну как то так.
    Выглядит замысловато, а на деле реализуется очень просто.
    Ответ написан
  • Почему file_get_contents ничего не выдаёт?

    copist
    @copist
    Empower people to give
    Возьмите библиотеки типа Guzzle или хотя бы просто curl.
    Они более корректно работают с протоколом HTTP, чем file_get_contents

    curl
    <?php
    
    $link = "http://www.aliexpress.com/item/Wholesale-price-free-shipping-good-quality-high-clear-phone-back-screen-protect-film-For-Huawei-Ascend/32258530279.html";
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
    curl_setopt( $ch, CURLOPT_URL, $link );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_ENCODING, "" );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    $ali = curl_exec( $ch );
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    
    if ($error) // ошибка curl, например таймаут
    {
        echo 'CURL error occurred during the request: ' . $error;
        echo "\n";
    } elseif ($http_code<200 || $http_code>=300) // код возврата не 200
    {
        echo 'HTTP error ' . $http_code. ' occurred during the request';
        echo "\n";
        var_dump(curl_getinfo( $ch )); // там все заголовки и другая отладочная информация
    } else
    {
        print_r($ali);
    }


    Guzzle
    $client = new GuzzleHttp\Client();
    $res = $client->get('http://www.aliexpress.com/item/Wholesale-price-free-shipping-good-quality-high-clear-phone-back-screen-protect-film-For-Huawei-Ascend/32258530279.html');
    echo $res->getStatusCode();
    // "200"
    echo $res->getHeader('content-type');
    // 'text/htm; charset=utf8'
    echo $res->getBody();
    // <html ...
    Ответ написан
  • Что учить дальше?

    copist
    @copist
    Empower people to give
    Если интерес к программированию не угасает, то это хорошо. А языков ещё много. Я знаю больше 15 языков, они живут себе в моей голове и между собой не спорят, уживаются как-то.

    Посмотри что ещё есть. Серверные языки, клиентские, интерпретируемые, компилируемые. Объектно-ориентированное программирование, событийное программирование, функциональное программирование, аспектное программирование.

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

    Я бы порекомендовал посмотреть в направлении проектирования и разработки программного обеспечения для мобильных устройств. Их очень много, они няшные :) и с каждым годом их будет больше, они будут навороченнее. Будут применяться во всех областях деятельности человека.
    Java для андроидов. Objective-C и Swift для айфонов. Мультиплатформенные приложения на JS/CSS/HTML.

    Ещё есть направление, которое приносит огромное удовольствие создателям программ и их пользователям. Пользователей прям за уши не оттащить. Готовы сутками такими программами пользоваться. Это игры.

    Ну и прикладное программирование, то есть программы для платформ Windows, MacOS, Linux. Всегда есть какая-то бытовая задача, которую нужно решить программно, а решения на базе JS/HTML/CSS уступают таким приложениям в скорости. Те же Java, Objective-C, C++, .Net и ещё куча языков.
    Ответ написан
    Комментировать
  • Можно ли сохранить файл полученный от веб сервера средствами js?

    copist
    @copist
    Empower people to give
    1. Отправь готовы файл пользователю по электронной почте
    2. Сделай реализацию слушателя событий на веб-сокетах и сообщай пользователю, когда сервер выдаст событие "файл готов".

    Ведь если делать как я придумал, то файл будет болтаться где то в папке веб сервера, доступен из вне для скачивания, и нужно писать какой то сборщик мусора на том же кроне.

    Генери длинный случайный URL. Удаляй по крону. Не вижу проблем.
    Ответ написан
  • На чем писать конструктор?

    copist
    @copist
    Empower people to give
    Дельный совет: посмотри как реализованы уже работающие современные конструкторы landing page
    https://www.google.ru/search?q=landing+page+online...

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

    Если ты делаешь LP под заказ, то тебе, может статься, тебе вполне хватит возможностей таких конструкторов.

    Моё предположение: весь конструктор - это JS, а на сервере весь шаблон и его настройки хранятся в NoSQL базе, например Mongo.

    Всё веселье начинается когда на странице попросят вывести грид из динамических данных, например, каталог товаров. Погугли в направлении BaaS (backend as service). Это может решить вопрос с хранением данных.
    Ответ написан
    Комментировать
  • Как сделать хэш универсальным?

    copist
    @copist
    Empower people to give
    Храни выданные ключи авторизации в отдельной таблице выданных ключей, а не в таблице пользователя.
    Ответ написан
  • Как исправить ошибки в PHP-коде?

    copist
    @copist
    Empower people to give
    PHP Strict Standards: Only variables should be passed by reference

    Мануал php.net/manual/ru/language.references.pass.php

    /* где-то в недрах Wordpress*/
    function get_comments($condition) { return array(); } // результат функции get_comments() не является объектом и не возвращает ссылку
    function separate_comments(&$comments) { } // параметр функции separate_comments() должен передаваться по ссылке
    
    /* где-то у вас */
    separate_comments(get_comments()); // <-- в данном случае недопустимо
    Ответ написан
    Комментировать
  • Как архивировать файлы на PHP?

    copist
    @copist
    Empower people to give
    Если требуется ООП, то можно сделать так на базе варианта, который предложил @vanton

    <?php
    /**
     * @see http://php.net/manual/ru/class.ziparchive.php
     */
    class MyZipArchive extends ZipArchive // унаследовал
    {
       public function addFiles($files = array()) // расширил
       {
          // ... см. http://davidwalsh.name/create-zip-php 
       }
    }
    
    $zip = new MyZipArchive;
    $zip->open($zipTmpAbsFilePath, \ZipArchive::OVERWRITE);
    $zip->addFiles(array(
      'preload-images/1.jpg',
      'rod.jpg',
    ));
    
    // ещё есть стандартные функции
    	// $zip->addGlob('path/to/files/*.*');
    	// $zip->addPattern('*.*', 'path/to/files/')
    
    $zip->close();
    Ответ написан
    Комментировать
  • "Разработка cms" как тема диплома?

    copist
    @copist
    Empower people to give
    UPD: Одним из главных требований дипломной работы - применение работы в реальной жизни. Такие работы лучше оцениваются и защита проходит легче.


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

    copist
    @copist
    Empower people to give
    В объекте предусмотрите приватное свойство-флаг, который будет означать, что этот объект нехранимый.

    <?php
    class Dummy
    {
        /**
         * Хранимый ли?
         * @var boolean
         */
        private $persistent = true;
    
        public $me;
    
        function __construct($me)
        {
            $this->me = $me;
        }
    
        public function forgetMe()
        {
            $this->persistent = false; // теперь нехранимый
        }
    
        /**
         * Какая то логика при сохранении
         */
        public function save()
        {
            if (!$this->persistent) // если нехранимый
            {
                echo $this->me . " was NOT saved\n";
                return true; // понять, простить и забыть
            }
            echo $this->me . " saved OK\n";
        }
    }
    
    $obj1 = new Dummy('first');
    $obj2 = new Dummy('second');
    
    $obj1->forgetMe();
    $obj1->save(); // -> first was NOT saved
    $obj2->save(); // -> second saved OK
    Ответ написан
    Комментировать
  • Если одной группе пользователей доступна страница, которая недоступна другой, то какой редирект надо делать для второй группы?

    copist
    @copist
    Empower people to give
    302, чтобы браузер не запомнил этот редирект.
    301, чтобы запомнил. в том числе запоминает и гуглобот.

    В данном случает надо 302.
    А если авторизованный пользователь или аноним лезет куда-то, куда ему лезть не положено по его правам, то 403 без редиректов.
    Ответ написан
    Комментировать
  • Как сделать serialize?

    copist
    @copist
    Empower people to give
    Всё дело в том, что в вашем примере 53, 55 и 56 - это должны быть строки. Надо принудительно приводить числа к строкам, чтобы 1:1 получить именно результат a:3:{i:0;s:2:"53";i:1;s:2:"55";i:2;s:2:"56";}
    <?php
        $a = array(
            0 => "53",
            1 => "55",
            2 => "56"
        );
    
        $b = serialize($a);
        echo $b; # a:3:{i:0;s:2:"53";i:1;s:2:"55";i:2;s:2:"56";}
    Ответ написан
    4 комментария