• Как можно установить время неответа на CURLOPT_WRITEFUNCTION?

    AUser0, я пердало старое, я про такое и не слышал и не хочу. я уже видел к чему приводит избыток новых штук, и с тех самых пор всегда делаю лучше вручную и лучше без них. Про новинки тысячу споров, много хайпа и в них никогда не найдешь того, кто "уже понял как". Даже в старом не всегда такие есть, но в старом хотя бы хелпа больше. А натыкать технологий и потом создавать топы "как ускорить запрос по вычитке 20млн записей потому шо у меня тут инфра и рэббит и вообще", а там задача "сумматор на записи прилепи" - ну короче ты понял

    самая печальная трабла с новыми штуками, которые называются так же как старые - это то, что они путаются по теории и описаниям терминов так, что потом ни ты разобраться не можешь, ни коллеги твои, говорите про хттп, одни про сани другие про коней, а говорить никто ни с кем не желает, хотят чтобы за секунду решалось, а становится невозможно
    Написано
  • Как можно установить время неответа на CURLOPT_WRITEFUNCTION?

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

    ну fopen/fsockopen почти то же самое.

    пожалуй я тогда пас, тут надо GPT долбить пока он не расскажет можно ли в пыхе через курл открыть постоянное соединение. я так не делал и предпочитаю если надо обмен данными - поменьше наворотов подключать, чтобы скрипт был максимально близок к голому PHP и отрабатывал максимально быстро, не делая никакой магии.
    Написано
  • Как можно установить время неответа на CURLOPT_WRITEFUNCTION?

    accountnujen, хорошо, что так и работает. На всякий случай убедился, что все работает как должно.

    Напишите в телегу вечером https___t_me_gzhegow, посмотрю что там у вас по скрипту. Попытаюсь пояснить на пальцах. Для меня курл это штука которая в основном используется по принципу "подключился, отправил данные, получил ответ, забыл". Возможно вы пытаетесь сделать постоянное соединение, открыв его curl-ом. Может такой функционал там и есть, в этом случае в нем я не шарю, но я бы делал это несколько иначе, и могу попробовать сделать.
    Написано
  • Как лучше реализовать возможность передать \Closure, чтобы запустить его не-блокирующим способом?

    gzhegow
    @gzhegow Автор вопроса
    Оказалось иначе. Хочешь параллель и "неблокирующий запуск" - нужно запускать второй процесс, а первый в этом случае становится менеджером процессов, где можно проверять состояние и stdout.

    Просто так из скрипта в PHP запустить замыкание неблокирующим способом нельзя, т.к. пхп не подымает единый процесс для управления паралеллью. Придется писать отдельный сервер на сокете, куда слать данные и которые будут потом разбираться, ну и в общем изобрести параллель с нуля. Сильно проще запустить второй процесс и подождать пока он закончится, считав stdout.
    Написано
  • Как ускорить выполнение запроса?

    Виталий Артемьев, походу 100 брэндов а не 100 товаров... Опять же зачем перевычитывать 20 лямов потом, может можно привязаться на сам момент записи где 20 лямов уже по сети проходят. Или агрегировать на самом sql или кликхаусе, чтобы туда-сюда 20 лямов не гонять. Много чего можно придумать, но кода нет и поэтому воздух сотрясаем.
    Написано
  • Как ускорить выполнение запроса?

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

    Что до "10 консюмеров" - теоритически это 10 поднятых процессов, каждый из которых пока неизвестно что делает и где его можно затюнинговать.

    Непонятно, что еще есть на машине. Даже на слабой машине даже обычный fpm, не то что прям рэббит движ - настраивается под 50 возможных процессов (это дефолтный конфиг если что). Точно 10 это достаточно?

    На тему достаточности - сам скрипт тоже важно как написан. Если он подымает целый фреймворк а не состоит из 20-30 строк кода - может от увеличения числа скриптов все очень напряжется. Но чесслово - я запускал на винде не на серверной машине сотку консолей, каждая из которых что-то читала-писала, и ничего, сидел ютуб еще одновременно с этим смотрел. 10 это прям как-то мало. С другой стороны - если задача прям хардовая - то по скрипту на ядро - может и нормально.

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

    Еще можешь упереться в сам рэббит, там есть особенности. Попробуй сэмулировать свою же задачу в сильно меньшем количестве данных на обычном кроне. Как бы ты это делал если бы скрипт работал раз в минуту. Подключение крутых и быстро реагирующих штук для построения отчетов вычиткой из СУБД миллионов записей само по себе странная идея. То есть быстро реагирующий инструмент для редко но постоянно считаемых тяжелых задач.

    На очень упрощенном уровне правильная очередь работает в режиме "накопи буффер из N или раз в M секунд выполни сколько скопилось даже если оно меньше чем N". То есть это крон + счетчик + менеджер процессов. Рэббит в свою очередь представляет собой буфер на 1 ячейку, которая всегда и немедленно передается на выполнение. Это прикольно, чтобы пользователи не ждали минуту, пока крон запустится, но для операций расчетов это вообще не важно. Другой вопрос, что рэббит это еще и приложение на порту/сокете, т.е. с доступом с нескольких машин, а крон это все таки штука на конкретной машине. Но обдумать можно.
    Написано
  • Есть ли ключ для запуска Chrome в новом окне?

    А есть какой способ (горячая клавиша, плагин) открывать ссылки в таком режиме как это происходит если например на твиче или ютубе нажать "Чат в новом окне"? Открывается новое окно в котором загружается профиль но не загружаются плагины и это окно без проблем можно сжать меньше 200 пикселей ширины - то есть полностью свободное окно без ограничений?
    Написано
  • Есть ли ключ для запуска Chrome в новом окне?

    А есть какой способ (горячая клавиша, плагин) открывать ссылки в таком режиме как это происходит если например на твиче или ютубе нажать "Чат в новом окне"? Открывается новое окно в котором загружается профиль но не загружаются плагины и это окно без проблем можно сжать меньше 200 пикселей ширины - то есть полностью свободное окно без ограничений?
    Написано
  • Можно ли как либо защитить php-проект от "угона" другим наёмным программистом (фрилансером)?

    Друзья, я хочу платить исполнителю 1 рубль, и он постоянно забирает то, что я разрабатываю. Как мне сделать так, чтобы платить по прежнему 1 рубль, но он не мог это сделать?

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

    Айтишка настолько привлекает бесконечными деньгами струящимися изо всех щелей, что даже вопросы связаны с тем, как больше положить СЕБЕ. А то что эти "фрилансеры" учились 10 лет, чтобы ты занимался поиском заказов, а не распределением награбленного - это не интересует. А их не интересует Ваше благополучение. Ну и живите с этим.

    Учитывая то, что все 20 лет развития айтишки оно шло именно к этому, то вообще создавать что-то - бред полнейший, пусть эти талантливые управляющие сами садятся и делают! И им сразу станет понятно, почему так хочется быть с честным бизнесменом и почему их честных не бывает. И у них еще есть смелость удивляться - почему в результате сотрудники не честные. Потому что в центре бабло, всё ж понятно.

    Умиляет, с какой радостью сами айтишники рассказывают как уничтожать коллег с помощью закона и принуждения ^_^ Стаду не понятно, что их держат в агрессии и негативе для того, чтобы они это делали и их зарплаты снижались.
    Написано
  • Как запустить Gulp из Php?

    Сергей Ержович, у меня тут вопрос возник, не знаешь ли как скормить параллельному процессу ссылку на поток из этого? Я недавно вопрос задавал как сделать чтение и запись по кусочкам. И там подсказали то что я только сейчас понял. Содержимое стрима надо вычитывать в одном процессе, писать в другом и обрабатывать в третьем, иначе они будут друг друга блочить создавая простои. Точнее не в процессе а в треде, но тред на пыхе мы заюзать не можем без второго процесса. Но сокет то мы открываем из конкретного процесса и ресурс отослать из одного в другой не можем. Идеи?
  • Как запустить Gulp из Php?

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

    От симфоней тоже простенько. А вот можно ли колаблы завернуть вопрос на лям. В амп вроде пишут можно. Посмотрим

    А, хитро, кешируем имя каллабла, запускаем второй скрипт, достаем с кеша имя, декорируем имя в воркер, минус как и всегда повторная инициализация
  • Можно ли в PHP передать управление в другой класс?

    Можно но так делать не считается хорошим тоном. Лучше обьявить все равно, и в конструкторе наполнить
  • Как запустить Gulp из Php?

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

    только почему $process->join(), подключиться процессом куда? (ну у них это видимо "подождать") но при чем тут подключение

    автору этого более чем достаточно.

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

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

    однако если действие будет тяжелое - станет видно, что одновременности нету, т.к. все шаги других фиберов ждут пока выполнится тяжелый. а вот если proc_open открыть то подвисший процесс не мешает другим делать свою работу, пока есть свободные треды на процессоре. впрочем наверняка класс Process под капотом именно это и делает и использует loop именно чтобы опрашивать потоки. Долбит по мозгам только yield который явно прерывает действие и переключается на следующий шаг, не уверен что он поддерживает таймаут на процессе как stream_select.

    но как я уже сказал автору это не надо.
  • Как запустить Gulp из Php?

    А, если вам не дали доступ к консоли, то вы либо можете на локальной машине собрать папку build и закопировать её на сервер по ftp (это тоже так себе вариант, но то что надо - он сделает).

    , либо использовать proc_open()

    синтаксис такой

    proc_open('console command', $desc, $pipes, $cwd, $env, ... и чото там еще)

    $cmd: с консоль командой все понятно. но тут надо понимать что ваш новый процесс будет поднят из PHP процесса, и если PHP в своем PATH имеет только несколько записей, а в винде у вас десятка два - то придется указывать полные пути до скриптов

    $desc: это описание потоков и их типов, ДОСТУПНЫХ процессу. Обычно выглядит так (читать от имени нового процесса):
    $desc = [
    0 => [ 'pipe', 'r'], // я читаю из этого потока
    1 => [ 'pipe', 'w'], // я пишу весь stdout/echo в этот поток
    2 => [ 'pipe', 'w'], // я пишу весь stderr в этот поток
    ];

    Можно два указать или ни одного.

    $pipes: после поднятия процесса эта переменная изнутри функции наполнится стримами потоков (resource). к ним можно потом применять fwrite()/fread()/feof() чтобы из них что-либо читать или в них писать. Поскольку $desc идет от имени процесса, то мы должны ЧИТАТЬ из потоков 1 и 2, а писать в поток 0, хотя на коде выглядит странно, когда написано 0 => ['pipe', 'r'], а потом в него почему-то fwrite(), но это именно то что должно быть процесс будет отсюда читать, а вы (программист) в-сюда писать.

    $cwd: current working directory. Папка в которой открывается консоль перед запуском вашего процесса. Соответственно из этой папки и вашего PATH (который можно принудительно указать в $env потом) будет определяться, можно ли запустить команду при помощи например "php", или обязательно придется писать "D:/OpenServer/modules/php7.3/bin/php.exe".

    $env: переменные окружения. Чаще всего нужно передавать свой PATH, т.к. пыха может не видеть весь PATH из винды. А точнее не так. Помнится в опенсервере есть такой прикол, что переменную PATH она читает из СИСТЕМНЫХ ПЕРЕМЕННЫХ КОНКРЕТНОГО ЮЗЕРА. То есть там три места есть. Есть переменные юзера, а есть системные, а есть системные у юзера. Вот из третьих оно наполняет, но там как правило хрен чего есть, поэтому иногда руками передают.

    ====

    Важная западня в этой функции.
    Вам точно захочется прочитать stdout. Но программа ваша может написать в stdout не сразу, а например в конце действия. Проще всего убедится написав перед echo "Hello World!" команду sleep(5). Программа повисит 5 секунд, после чего выведет что вы просили.

    Но вам скорее всего захочется, чтобы по мере того как программа делает что-то и выводит вы сразу же получали от неё ответ, а не ждали пока она кончится.

    Тут вам придется потренироваться с stream_select(). Ближайшая аналогия stream_select() это как бы "форич с таймаутом но только для потоков". То есть вы в него сгружаете все потоки что у вас есть, ставите таймаут в одну миллисекунду и оборачиваете это в бесконечный цикл, в каждом шаге проверяете статус процесса через proc_get_status($proc). Если процесс кончился - удаляете его из массива запущенных процессов, при этом сам цикл завершится если процессов в "пуле" не осталось.

    Это позволит вам читать процесс асинхронно давая ему одну миллисекунду на обмен вместо ожидания пока придет первый байт.
  • Middleware пример архитектуры для цикла запрос - контроллер - ответ, да?

    MikUrrey, обычно никак. Суть внедрения - найти того, кто разобрался, дать ему задачу, и если начнет умничать и показывать знания - уволить первым. Если смиренно отдаст рабочую штуку - похвалить всю команду, но напомнить что каждый сам за себя. Если не справился - опозорить лично. Здесь вообще нет мидлваров, здесь есть технология выставления умных дурнями.

    Я когда-то разбирался как нейронные сети внедряют. Люди втирали мне что это легко, не зная как это работает. А потом я узнал как это работает в деталях. Колбэки, функции активации, веса и их изменение, прогоны на базовых данных, разбитие задачи на примитивы... А ещё чуть позже узнал как это работает в компаниях. Один сисадмин фильтровал контент с сиськами используя для фильтрации нейросеть отличающую кошку от собаки. И это... работало. И он бы уверен что у него нейросеть спроектирована под задачу. Вот так эта планета работает.
  • Middleware пример архитектуры для цикла запрос - контроллер - ответ, да?

    Я понял, смотри, сначала идея, потом ООП. Идея это не способ создать ООП поверх нее. Идея в том чтобы обернуть метод, а потом для него пишутся интерфейсы типа PSR-15 чтобы сделать эту идею на ООП. По твоему описанию - наоборот, у меня тоже так было, но со временем уложилось в голове.

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

    Чтобы сделать его на ооп написали интерфейсы. Причем как всегда написали странно и криво, под PHP, якобы у нас есть serverRequest у которого обязательно есть бадик, заголовки, и так далее. Мидлвар как идея может быть реализован на двух функциях, а обертка с интерфейсами и привязанной к ней функциональностью веб-сервера лично по мне - какой-то бред. Что доказано ларавелем, где такой реализации нет, и симфони - где вообще нет мидлваров, их попробовал реализовать Laminas, бывший Zend, потому что "прикольно получается", но на деле люди все равно ставят люмен, чтобы получить роутер от ларавеля, или симфонийский, чтобы писать роуты в аннотациях, а потом вручную прикручивают к index.php обертку из мидлов. Пхп писаки подозрительно хотели связать слово "мидлвар" с парадигмой "запрос-ответ", хотя по факту это такая элементарная плюшка для любого стиля программирования.

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

    В этом есть подводный камень нашей вавилонской пхп-башни. Каждый топит в своё и считает это истиной. А на попытку обсуждать что-то в личных чатах чаще всего ты получаешь отказ по любой причине - то кто-то думает что его жизнь очень важна, то у него почему-то нет времени, то он тебе не обязан и так далее далее далее двигаясь можно воткнуться в ролики сравнения двух глав государств, одного из которых встречают парадом и фанфарами, а второй с уважением относится к культуре принимающей стороны. И россиюшка сейчас уверена, что если тебя боятся, то это лучше, чем если ты уважаешь принимающую сторону и благодаришь её. Отсюда в нашем обществе не способна появится идея, которая действительно кого-то выручает, способна появится только идея, которая унижает. Капитализм это порождает, так что такое везде. Какое понимание это дает? Ну то что многие теории в любой науке написанные людьми из этой вселенной сегодня нужно заново проверять, потому как их писали не всегда те, кто их придумал, а те, кто был другом короля. И о чем он думал - о своем кошельке или о человечестве вопрос вопрос.

    А заодно это рождает ворох проблем связанный с тем, что решает не тот, кто знает, а тот кто платит. Отсюда понятна необходимость сотрудников тупых как пень (управленцев вместо инженеров, рекрутеров вместо кадровиков, прокуроров вместо судей - всё чтобы разделить любые моменты с логикой на два момента без логики, где понятно кто победитель), чтобы отсеивать умных, которые поставят под вопрос существующий порядок, чтобы получить результат. Это дает прекрасную почву, чтобы развивались те, кто ничего не делает, и чтобы подыхали те, кто нашел ответы на все вопросы. Проще говоря умных быть не должно, а глупые получают всё, потому что учились не предсказывать исход, а ловить момент. Идеальная стабильность. И клинический психоз. Мой.
  • Как организовать локальный hosts с портами для разработки сайтов в docker?

    Ты хочешь поднять nginx локально чтобы он играл роль load balancer для nginx изнутри контейнеров? Нужно сделать еще один контейнер тогда и всех остальных в одну сеть спарить. В более простом случае - пиши один докер-композ на проект. Но их может быть и несколько - например для тестов свой, для приложения - свой. Их может быть даже два для приложения - например в одном пишете все что подключается (субд, очереди и тд), а во втором - все что из приложения - воркеры, консольки, хттп-серверы. Потом их нужно соединять через точку с запятой (для винды) или через двоеточие (для линукса и мака) в командой строке, для этого удобно использовать Makefile, чтоб каждый раз не печатать путь до конфига, а просто вызывать "make up/down".

    А если вопрос просто переключения - то docker-compose.yml пиши под каждый проект и везде свои порты. Решил поработать над проектом - поднял этот композ, решил на другим - этот погасил, поднял другой. В этом и идея была. Соответственно порт пишешь внешний какой прямо сейчас хочется, с ним и работаешь.
  • Есть способ выдергивать JS обьекты/JSON из тегов script в HTML документе средствами PHP?

    да не, просто в регулярку дописываешь кроме тега скрипт тот кусок кода с которого начинается искомый json и получишь массив из одного совпадения. или вообще preg_match() вместо preg_match_all(), тогда первое совпадение.
  • Как получить топ 10 рефавода из бд php?

    Слушай, ну тебе нужно написать SQL запрос, чтоб сортировать по полю reward.

    Или ты сюда написал, чтобы мы тебе готовый запрос написали?

    Ну он то простой, но это принципиально забавно, как вы пытаетесь с фриланса заказы сюда постить, чтобы вам их делали за спасибо.