Стопроцентная предоплата — хороший вариант для единичного клиента, но если речь идёт про продажу продукта в качестве услуги, то стоит подумать немного наперёд.
Самый распространённый подход сейчас —SaaS, продажа доступа к собственной инфраструктуре. Исходники и их исполнение остаются на вашей стороне, а вы берёте месячную/годовую/единоразовую плату за доступ к сервису.
Можно рассмотреть кодирование исходников в ioncube или компилирование собственного кода в расширение php из cpp (либо использование суррогатов вроде Zephir), но всё это можно взломать/обойти/пропатчить.
Меняйте подход к продаже своих слуг, раз их воруют.
Блокируют, что бы исключить нагрузку на сервер. Боты могут бесконтрольно рекурсивно скачивать миллионы страниц с сервера, а толку от них конкретно вам не будет никакого.
Если бы мотивацией бота был ещё какой-то смысл, он бы выдал себя за обычного пользователя.
Если формат входящих данных изменить нельзя (а стоило бы), то можно использовать простой лайфхак: передать в json-парсер данные в виде массива.
Если у нас были данные вида {object}, {object}, {object}
достаточно обернуть их в квадратные скобки: [{object}, {object}, {object}]
Json-парсер должен будет вернуть массив с данными.
Если вёрстка такая же простая, как и в примере, то копайте в сторону регулярных выражений. Если вёрстка более сложная, может содержать несколько одинаковых тегов, вложенных один в другой, то придётся обрабатывать данные за пределами базы данных. Способ обработки будет зависеть уже от используемого языка программирования.
К сожалению, с кодом приложения на Реакте не получится работать привычными разбором html-кода, полученного от сервера. Рабочим вариантом будет использование Chrome headless решений.
Карта Яндекса, бесспорно, хороша.
Однако если стоит задача показывать исключительно карту крупных городов со статическими точками, без построения маршрутов, зон доставок, учёта пробок и всего такого прочего, то стоит посмотреть в сторону OSM. На основе этих карт есть несколько достойных библиотек, например OpenLayers или излишне политизированный Leaflet.
Конкретно этот синтаксис предполагает передачу анонимной функции. Если хочется и именованную функцию объявить и в качестве callback'а её отправить, то следует отдельно объявить функцию и отдельно на неё сослаться:
function xep($str){
}
$str = [1,2,3];
array_map('xep' ,$str);
Самый простой вариант сделать подобное управление в php — использовать внешние флаги. Вариантов много, например, можно взять Redis или Memcache: один процесс (управляющий) ставит флаг cron:check:row123:pause = 1, второй процесс (обрабатывающий) в своём цикле считывает флаг. Аналогично можно сделать флаг cron:check:stop = 1 и остановить обработку вообще.