MySQL 트리거에서 PHP 스크립트 호출
레코드가 MySQL 데이터베이스 테이블에 삽입 될 때 PHP 페이지 / 함수를 호출하는 방법이 있습니까? 우리는 레코드 삽입 절차를 제어 할 수 없습니다. PHP 스크립트를 다시 호출 할 수있는 트리거 메커니즘이 있습니까?
트리거는 PHP 서버가 아닌 MySQL 서버에서 실행됩니다 (둘 다 같은 컴퓨터에 있더라도).
그래서 저는 이것이 가능하지 않다고 말하고 싶습니다. 적어도 간단하지는 않습니다.
그래도 MySQL FAQ on Triggers의이 항목을 고려 하면 다음과 같습니다.
23.5.11 : 트리거가 UDF를 통해 외부 애플리케이션을 호출 할 수 있습니까?
예. 예를 들어 트리거는 https://github.com/mysqludf/lib_mysqludf_sys#readme에서
sys_exec()
사용 가능한 UDF를 호출 할 수 있습니다.
따라서 php 실행 파일 / 스크립트를 시작하는 UDF 함수를 통한 방법이있을 수 있습니다. 쉽지는 않지만 가능해 보입니다. ;-)
친구와 저는 Bernardo Damele의 sys_eval UDF를 호출하는 방법을 알아 냈지만 솔루션은 제가 원하는만큼 우아하지 않습니다. 우리가 한 일은 다음과 같습니다.
- Windows를 사용하고 있기 때문에 Roland Bouman의 지침을 사용하여 Windows 용 UDF 라이브러리를 컴파일 하고 MySQL 서버에 설치해야했습니다.
- sys_eval을 호출하는 저장 프로 시저를 만들었습니다.
- 저장 프로 시저를 호출하는 트리거를 만들었습니다.
저장 프로 시저 코드 :
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);
저장 프로 시저를 사용하는 것에 대해 흥분하지 않고 추가 오버 헤드를 생성하는지 여부는 알 수 없지만 작동합니다. 행이 sometable에 추가 될 때마다 트리거가 실행됩니다.
데이터베이스 트리거에서 PHP 코드를 호출 하는 것은 매우 나쁜 프로그래밍 관행 으로 간주되어야합니다 . 이러한 "미친"트릭을 사용하여 해결하려는 작업을 설명해 주시면 만족스러운 솔루션을 제공 할 수 있습니다.
추가됨 19.03.2014 :
이전에 몇 가지 추론을 추가해야했지만 지금은이 작업을 수행 할 시간을 찾았습니다. 중요한 발언에 대해 @cmc에게 감사드립니다. 따라서 PHP 트리거는 애플리케이션에 다음과 같은 복잡성을 추가합니다.
@Johan이 말한 것처럼 애플리케이션에 일정 수준의 보안 문제 (외부 PHP 스크립트 호출, 권한 설정, 아마도 SELinux 설정 등)를 추가합니다.
애플리케이션에 복잡성을 더 추가하고 (데이터베이스 작동 방식을 이해하려면 이제 SQL뿐 아니라 SQL과 PHP를 모두 알아야 함) SQL뿐만 아니라 PHP도 디버깅해야합니다.
응용 프로그램에 추가 실패 지점 (예 : PHP 잘못된 구성)을 추가합니다. 진단해야하는 오류도 있습니다 (트리거가 실패한 모든 PHP 인터프리터 호출과 그 이유를 기록 할 디버그 코드를 보유해야한다고 생각합니다).
성능 분석의 추가 지점을 추가합니다. 인터프리터를 시작하고, 스크립트를 바이트 코드로 컴파일하고, 실행해야하기 때문에 각 PHP 호출은 비용이 많이 듭니다. 따라서이 트리거를 포함하는 각 쿼리는 느리게 실행됩니다. 그리고 EXPLAIN은 트리거 루틴 성능으로 인해 쿼리가 느려진다는 사실을 알려주지 않기 때문에 쿼리 성능 문제를 분리하는 것이 어려울 수 있습니다. 그리고 트리거 시간이 느린 쿼리 로그에 어떻게 덤프되는지 잘 모르겠습니다.
응용 프로그램 테스트에 몇 가지 문제를 추가합니다. SQL은 매우 쉽게 테스트 할 수 있습니다. 그러나 SQL + PHP 트리거를 테스트하려면 약간의 기술을 적용해야합니다.
나는 이것을 찾았다:
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 ;
긴 폴링을 사용하는 경우 PHP 스크립트가 지속적으로 db를 폴링하는 것을 원하지 않는 경우이 정확한 문제에 대해 생각하고있었습니다. 폴링은 어딘가에서 수행해야하며 메모리가 가장 좋습니다. 따라서 어떻게 든 트리거가 정보를 memcache와 같은 것에 넣을 수 있다면 php는 전체적으로 훨씬 덜 집중적 인 폴링을 할 수 있습니다. mysql이 memcache를 사용하는 방법이 필요합니다. 특정 사용자 ID가있는 미리 정의 된 변수에 포함될 수 있습니다. 데이터가 검색되면 php는 db가 다시 설정할 때까지 var를 재설정 할 수 있습니다. 그래도 타이밍 문제에 대해서는 확실하지 않습니다. 아마도 이전에 선택한 키를 저장하는 두 번째 변수 일 것입니다.
If you have transaction logs in you MySQL, you can create a trigger for purpose of a log instance creation. A cronjob could monitor this log and based on events created by your trigger it could invoke a php script. That is if you absolutely have no control over you insertion.
In order to get a notification from the database I wrote a command line script using websocket to check for the latest updated timestamp every second. This ran as an infinite loop on the server. If there is a change all connected clients will can be sent a notification.
I don't know if it's possible but I always pictured myself being able to do this with the CSV storage engine in MySQL. I don't know the details of this engine: http://dev.mysql.com/doc/refman/5.7/en/csv-storage-engine.html but you can look into it and have a file watcher in your operating system that triggers a PHP call if the file is modified.
A cronjob could monitor this log and based on events created by your trigger it could invoke a php script. That is if you absolutely have no control over you insertion.. If you have transaction logs in you MySQL, you can create a trigger for purpose of a log instance creation.
Run away from store procedures as much as possible. They are pretty hard to maintain and are VERY OLD STUFF ;)
참고URL : https://stackoverflow.com/questions/1467369/invoking-a-php-script-from-a-mysql-trigger
'IT TIP' 카테고리의 다른 글
Visual Studio TFS Git에서 변경 사항이 표시되지 않음 (0) | 2020.12.08 |
---|---|
페이스 북 로그인 문제-canOpenURL : URL에 대한 실패 : "fbauth2 : ///"-오류 : "(null)" (0) | 2020.12.08 |
반복기의 기본값은 무엇입니까? (0) | 2020.12.08 |
Executor를 종료하지 않고 ThreadPoolExecutor의 모든 작업이 완료 될 때까지 기다리는 방법은 무엇입니까? (0) | 2020.12.08 |
char * envp []는 main () 휴대용에 대한 세 번째 인수입니다. (0) | 2020.12.08 |