• Клонирование на пальцах (когда применять)?

    DevMan
    @DevMan
    вы создали объект, наполнили его данными, вам нужны независимые друг от друга копии данного объекта, вы используете клонирование.

    https://ideone.com/U3ARwH
    Ответ написан
    Комментировать
  • Клонирование на пальцах (когда применять)?

    php666
    @php666
    PHP-макака
    Если не понимаешь - забей. Clone редко используется - у меня в одном большом проекте всего два раза. Когда тебе понадобится - тогда и придешь к этому...
    Ответ написан
    Комментировать
  • Где взять реальные примеры кода использования ооп в веб-сервисах?

    php666
    @php666
    PHP-макака
    при выводе доски объявлений
    ....некая сущность, назовём её Mapper, возвращает коллекцию объектов - объектов объявлений. Каждый объект == одно объявление. Объявление может иметь свойства - VIP-статус (дата конца этого статуса), типичные поля для объявления типа заголовок + текст. Далее, объявление может иметь изображения. Объект объявления имеет метод, который запрашивает у другой сущности объекты своих изображений, которые в свою очередь знают, как сформировать URl к изображению или иные характеристики изображений. Объект объявления имеет метод getPaymentSystem() - возвращается объект класса типа Kassa, он может возвратить объект Робокасса (или Frikassa), который умеет генерировать URL, который необходим для транзакции оплаты платных услуг данного объекта объявления....

    --- это лишь малая описательная часть. Как пример.

    я пока не понимаю как это использовать
    и не поймешь без подсказок.
    Твоя цель - открыть книгу "мартин фаулер архитектура корпоративных программных приложений pdf" почитать минимум 1, 2, 9 и 10 главу.
    Ответ написан
    8 комментариев
  • Как запустить массивную задачу на php?

    bigton
    @bigton
    Web-программист
    Все таки на PHP писать скрипты, которые должны выполняться часами, не самая лучшая идея.
    Каждую большую задачу можно разбить на маленькие.

    Допустим, вам надо скачать информацию по всем товарам магазина.
    Информация находится по адресу https://api.site.ru/item/N, где N - ID товара от 1 до 1М.

    1. Сделаем таблицу задач со следующей структурой:
    - task_id
    - item_url (например, https://api.site.ru/item/1)
    - status (0 - задача не обработана, 1 - задача в работе, 2 - задача завершена)
    - process_id (ID PHP процесса который занял задачу для выполнения)

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

    $process_id = microtime(TRUE).getmypid(); // некоторое уникальное значение

    // попытка занять свободную задачу на выполнение
    $mysqli->query("UPDATE `task` SET `process_id` = $process_id WHERE `status` = 0 AND `process_id` = 0");

    // получаем информацию по задаче
    $mysqli->query("SELECT * FROM `task` WHERE `process_id` = $process_id");

    // выполняем задачу, что-то скачиваем
    ...

    // ставим в таблице задаче статус "завершена"

    3. Теперь надо только организовать постоянный запуск этого скрипта.

    Создадим sh скрипт, например, task.sh и поставим в кроне его запуск на каждую минуту.
    Сам же скрипт будет каждую секунду вызывать task.php.

    #!/bin/bash
    
    for i in $(seq 0 59)
    do
        
        if [ `ps aux | grep -c task.php` -le 10 ]; then
    	    /usr/bin/wget -q -O /dev/null http://localhost/task.php &
        fi
    
        sleep 1;	
    done


    Заключение. Таким образом вы сможете контролировать ход выполнения глобальной задачи, смотреть какие микрозадачи подвисли и отправлять их на перезапуск. Предложенное решение можно сильно улучшить.
    Ответ написан
    1 комментарий
  • Как максимально быстро на PHP скопировать файл?

    @Starche
    Python/JS/PHP Tech Lead
    file_put_contents($file, fopen($url, 'r'));
    Идея в том, что fopen создаёт поток, и этот поток передаётся в file_put_contents. Соответственно этот поток не считывается в память весь, а буферизуется и сбрасывается на диск по мере вычитывания. См. https://php.net/file_put_contents
    Если data является потоковым ресурсом (stream), оставшийся буфер этого потока будет скопирован в указанный файл.
    Ответ написан
    Комментировать
  • Как отредактировать metadata jpeg файла-например поле Software?

    SerJook
    @SerJook
    кодер
    Можно попробовать PEL: PHP Exif Library.

    use \lsolesen\pel\PelJpeg;
    use \lsolesen\pel\PelTag;
    
    $jpeg = new PelJpeg("test.jpg");
    $ifd0 = $jpeg->getExif()->getTiff()->getIfd();
    $entry = $ifd0->getEntry(PelTag::SOFTWARE);
    if ($entry !== null){
        $entry->setValue('Edited by PEL');
    }
    $jpeg->saveFile("test_out.jpg");
    Ответ написан
    Комментировать
  • Как перебрать массив изменив порядок элементов и отсеять не нужные элементы?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    array_filter + анонимная функция фильтрующая по ключам
    Ответ написан
    8 комментариев