Вызов Сценария PHP от триггера MySQL

Большое расположение и объяснение. Я боролся с теми же самыми проблемами. Я волновал с очень похожей структурой. Мой варьируется немного.

Development/
   Trunk/
      Binaries/  -- Shared libraries
      Source/
      Test/
      Docs/      -- Documentation
TeamBuildTypes/  -- Build definitions
  • Добавление двоичной папки позволяет Вам иметь одно расположение в ответвлении, где все Ваши проекты могут сослаться на совместно использованные библиотеки
  • , Мы помещаем документацию здесь, таким образом, это может переместиться наряду с, он - определенное ответвление.
  • Наши определения сборки на уровне разработки, так как мы можем изобразить их в одном месте для всех ответвлений, но это могло определенно быть на уровне ответвления, который может иметь больше смысла.

Должен двоичные файлы (средства управления, библиотеки, и т.д.) быть сохраненным в управлении исходным кодом? Если так, это должен быть свой собственный Проект Команды?

я думаю, что они должны определенно быть источником, которым управляют, но я не вижу оснований для помещения их в их собственный проект команды. Одной проблемой, чтобы быть осторожной с является TFS, по некоторым причинам рассматривает немного отличающиеся двоичные файлы. У меня были проблемы, где я обновил двоичные файлы в управлении исходным кодом, но "Получение Последнего" на других машинах не вызывает обновление файлов. Иногда необходимо сделать, "Получают Определенную Версию" и проверяют опцию "Overwrite Unchanged Files" на тот конкретный файл.

60
задан Mifeet 19 May 2016 в 15:26
поделиться

6 ответов

Триггер выполняется на сервере MySQL, а не на сервере PHP (даже если они оба находятся на одном компьютере).

Итак, я бы сказал, что это не совсем возможно - - по крайней мере, не просто.


Тем не менее, учитывая эту запись из MySQL FAQ по триггерам :

23.5.11: Могут ли триггеры вызывать внешнее приложение через UDF?

Да. Например, триггер может вызвать UDF sys_exec () , доступную здесь: https://github.com/mysqludf/lib_mysqludf_sys#readme

Итак, может быть способ через функцию UDF, которая запускала бы исполняемый файл / скрипт php. Не так просто, но кажется возможным. ; -)

33
ответ дан 24 November 2019 в 17:51
поделиться

Это следует считать очень плохой практикой программирования для вызова кода PHP из триггера базы данных. Если вы объясните задачу, которую пытаетесь решить, используя такие «безумные» уловки, мы можем предоставить удовлетворительное решение.

ДОБАВЛЕНО 19.03.2014:

Я должен был добавить некоторые рассуждения раньше, но только нашел время, чтобы сделать это сейчас. Спасибо @cmc за важное замечание. Итак, триггеры PHP добавляют в ваше приложение следующие сложности:

  • Добавляет определенную степень проблем безопасности в приложение (вызовы внешних сценариев PHP, настройка разрешений, возможно, настройка SELinux и т. д.), как говорит @Johan.

  • Добавляет дополнительный уровень сложности в ваше приложение (чтобы понять, как работает база данных, теперь вам нужно знать как SQL, так и PHP, а не только SQL), и вам придется отлаживать PHP также, не только SQL.

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

  • Добавляет дополнительный пункт анализа производительности. Каждый вызов PHP стоит дорого, так как вам нужно запустить интерпретатор, скомпилировать скрипт в байт-код, выполнить его и т. Д. Таким образом, каждый запрос, включающий этот триггер, будет выполняться медленнее. Иногда бывает сложно изолировать проблемы с производительностью запроса, поскольку EXPLAIN не Я ничего не могу сказать о том, что запрос выполняется медленнее из-за производительности процедуры запуска. И я не уверен, как время триггера записывается в журнал медленных запросов.

  • Добавляет некоторые проблемы при тестировании приложений. SQL можно довольно легко протестировать. Но чтобы протестировать триггеры SQL + PHP, вам придется применить некоторые навыки.

15
ответ дан 24 November 2019 в 17:51
поделиться

Если у вас есть журналы транзакций в MySQL, вы можете создать триггер для создания экземпляра журнала. Cronjob может отслеживать этот журнал и на основе событий, созданных вашим триггером, вызывать скрипт php. Это если у вас нет никакого контроля над своей вставкой.

1
ответ дан 24 November 2019 в 17:51
поделиться

Я нашел это:

http://forums.mysql.com/read.php? 99,170973,257815 # msg-257815

DELIMITER $$
CREATE TRIGGER tg1 AFTER INSERT ON `test`
FOR EACH ROW
BEGIN
\! echo "php /foo.php" >> /tmp/yourlog.txt
END $$
DELIMITER ;
6
ответ дан 24 November 2019 в 17:51
поделиться

Мы с другом придумали, как вызвать Бернардо Дамеле sys_eval UDF, но решение не такое элегантное, как хотелось бы. Вот что мы сделали:

  1. Поскольку мы используем Windows, нам пришлось скомпилировать библиотеку UDF для Windows, используя инструкции Роланда Боумана , и установить их на нашем сервере MySQL.
  2. Мы создали хранимую процедуру, которая вызывает sys_eval.
  3. Мы создали триггер, который вызывает хранимую процедуру.

Код хранимой процедуры:

DELIMITER $$
CREATE PROCEDURE udfwrapper_sp
(p1   DOUBLE,
 p2   DOUBLE,
 p3 BIGINT)
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('C:/xampp/php/php.exe -f "C:/xampp/htdocs/phpFile.php" ', p1, ' ', p2, ' ', p3);
 SET result = sys_eval(cmd);
END$$;

Код триггера:

CREATE TRIGGER udfwrapper_trigger AFTER INSERT ON sometable
FOR EACH ROW
CALL udfwrapper_sp(NEW.Column1, NEW.Column2, NEW.Column3);

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

25
ответ дан 24 November 2019 в 17:51
поделиться

Я думал именно об этой проблеме в случае с длинным опросом, когда я не хотел, чтобы скрипт php постоянно опрашивал базу данных. Опрос нужно было бы где-то делать, память, наверное, подойдет лучше всего. Так что, если бы каким-то образом триггер мог помещать информацию во что-то вроде кэша памяти, тогда php мог бы опрашивать, который в целом был бы намного менее интенсивным. Просто нужен метод для mysql для использования memcache. Возможно, в предопределенную переменную с определенным идентификатором пользователя. После получения данных php может сбросить переменную, пока база данных не установит ее снова. Однако не уверен в проблемах с синхронизацией. Возможно, вторая переменная для хранения предыдущего выбранного ключа.

6
ответ дан 24 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: