MySQL 트리거에서 PHP 스크립트 호출
MySQL 데이터베이스 테이블에 레코드를 삽입할 때 PHP 페이지/함수를 호출하는 방법이 있습니까?우리는 기록 삽입 절차를 통제할 수 없습니다.PHP 스크립트를 호출할 수 있는 트리거 메커니즘이 있습니까?
트리거는 PHP 서버가 아닌 MySQL 서버에서 실행됩니다(둘 다 같은 머신에 있는 경우에도 마찬가지).
그래서 저는 이것이 그다지 가능하지 않다고 생각합니다. 적어도 단순하지는 않습니다.
그러나 트리거에 관한 MySQL FAQ의 다음 항목을 고려합니다.
23.5.11: 트리거가 UDF를 통해 외부 애플리케이션을 호출할 수 있습니까?
는 ", ", ", "를 할 수 .
sys_exec()
UDF는 이쪽에서 입수 가능합니다.https://github.com/mysqludf/lib_mysqludf_sys#readme
따라서 UDF 함수를 통해 php 실행 파일/스크립트를 실행하는 방법이 있을 수 있습니다.그렇게 쉽지는 않지만 가능할 것 같아. ;-)
친구와 나는 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);
스토어드 프로시저가 있는 것이 마음에 들지 않고, 오버헤드가 추가되는지는 모르겠지만, 효과가 있습니다.행이 추가될 때마다 트리거가 실행됩니다.
데이터베이스 트리거에서 PHP 코드를 호출하는 것은 매우 잘못된 프로그래밍 관행으로 간주됩니다.이러한 "미친" 트릭을 사용하여 해결하려는 작업을 설명해주면 만족스러운 솔루션을 제공할 수 있을 것입니다.
2014.03.03 추가:
좀 더 일찍 논리를 달았어야 했는데, 지금 시간을 내서 이 일을 해냈을 뿐이에요.@cmc 님의 소중한 말씀 감사합니다.따라서 PHP 트리거는 다음과 같은 복잡성을 애플리케이션에 추가합니다.
@Johan이 말하는 대로 애플리케이션에 일정 수준의 보안 문제(외부 PHP 스크립트 호출, 권한 설정, 아마도 SELinux 설정 등)를 추가합니다.
애플리케이션의 복잡성이 높아집니다(데이터베이스가 어떻게 동작하는지 알기 위해서는 SQL뿐만 아니라 SQL과 PHP를 모두 알아야 합니다).또한 SQL뿐만 아니라 PHP도 디버깅해야 합니다.
응용 프로그램에 장애 지점을 추가합니다(예를 들어 PHP 구성 오류). 진단도 필요합니다(트리거는 실패한 모든 PHP 인터프리터 호출과 그 이유를 기록하는 디버깅 코드를 보유해야 합니다).
퍼포먼스 분석 포인트를 추가합니다.인터프리터 시작, 스크립트 바이트 코드 컴파일, 실행 등이 필요하기 때문에 각 PHP 콜은 비용이 많이 듭니다.따라서 이 트리거와 관련된 각 쿼리는 더 느리게 실행됩니다.또한 트리거 루틴 성능 때문에 쿼리가 느려지는 것에 대해 설명하지 않기 때문에 쿼리 성능 문제를 분리하는 것이 어려울 수 있습니다.트리거 시간이 느린 쿼리 로그에 어떻게 덤프되는지 모르겠어요
응용 프로그램 테스트에 몇 가지 문제를 추가합니다.SQL은 매우 쉽게 테스트할 수 있습니다.그러나 SQL + PHP 트리거를 테스트하려면 몇 가지 기술을 적용해야 합니다.
php 스크립트가 DB를 지속적으로 폴링하지 않아도 되는 긴 폴링 케이스에 대해 정확히 이 문제에 대해 생각하고 있었습니다.어디선가 여론조사를 해야 할 텐데, 아마 기억이 가장 좋을 거예요.따라서 트리거가 정보를 memcache와 같은 것에 넣을 수 있다면 php는 전체적으로 훨씬 덜 집중적인 폴링을 할 수 있습니다.memcache를 사용하려면 mysql 메서드가 필요합니다.특정 사용자 ID를 가진 미리 정의된 변수에 포함될 수 있습니다.데이터가 검색되면 php는 db가 다시 설정될 때까지 var를 리셋할 수 있습니다.타이밍 문제는 잘 모르겠어요.이전에 선택한 키를 저장하는 두 번째 변수일 수 있습니다.
이걸 찾았어요
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 ;
MySQL에 트랜잭션 로그가 있는 경우 로그 인스턴스 생성을 위한 트리거를 생성할 수 있습니다.cronjob은 이 로그를 감시하고 트리거에 의해 생성된 이벤트를 기반으로 php 스크립트를 호출할 수 있습니다.삽입을 전혀 제어할 수 없는 경우입니다.
데이터베이스에서 알림을 받기 위해 웹소켓을 사용하여 명령줄 스크립트를 작성하여 최신 타임스탬프를 초당 확인했습니다.이것은 서버상에서 무한 루프로서 동작합니다.변경이 있을 경우 연결된 모든 클라이언트에 알림을 보낼 수 있습니다.
가능할지는 모르겠지만 MySQL의 CSV 스토리지 엔진으로 이 작업을 수행할 수 있다고 항상 상상했습니다.이 엔진에 대한 자세한 내용은 http://dev.mysql.com/doc/refman/5.7/en/csv-storage-engine.html에서 알 수 없지만 파일을 수정하면 PHP 호출을 트리거하는 파일 워처를 운영체제에 설치할 수 있습니다.
cronjob은 이 로그를 감시하고 트리거에 의해 생성된 이벤트를 기반으로 php 스크립트를 호출할 수 있습니다.즉, 삽입을 전혀 제어할 수 없는 경우입니다.MySQL에 트랜잭션 로그가 있는 경우 로그 인스턴스 생성을 위한 트리거를 생성할 수 있습니다.
가능한 한 스토어 절차에서 벗어나세요.그것들은 유지보수가 매우 어렵고 매우 오래된 물건입니다;)
언급URL : https://stackoverflow.com/questions/1467369/invoking-a-php-script-from-a-mysql-trigger
'IT' 카테고리의 다른 글
폼이 전송된 후 백그라운드에서 PHP 스크립트를 실행하려면 어떻게 해야 합니까? (0) | 2022.11.17 |
---|---|
기존 데이터베이스의 "innodb_file_per_table" 파라미터를 "OFF"에서 "1"로 변경하려면 어떻게 해야 합니까? (0) | 2022.11.17 |
원칙 2 DQL에서 now()를 사용하려면 어떻게 해야 합니까? (0) | 2022.11.17 |
DataFrame 열 유형을 문자열에서 날짜/시간으로 변환 (0) | 2022.11.17 |
MariaDB over SSL이 작동하지 않습니다. "인증서 확인 실패" (0) | 2022.11.17 |