2016-08-16 9 views
1

백그라운드에서 실행되는 서버 시스템을 작성 중입니다. 매우 단순화 된 용어로 자체 스크립팅 언어가 있습니다. 즉, 프로세스가 그 언어로 작성되거나 다른 프로세스 등을 호출 할 수 있다는 의미입니다.이 시스템을 간단한 PHP 크론 작업에서 한 번에 하나의 인스턴스 만 Supervisor가 관리하는 장기 실행 프로세스 세트에 허용됩니다.PHP에서 Unix 신호 처리의 안정적인 통합 테스트를 수행하는 방법은 무엇입니까?

이러한 점을 염두에두고 저는 이러한 프로세스가 개발 과정에서 직접 또는 수퍼바이저가 작업을 중지하거나 다시 시작하는 정상적인 과정에서 언제든지 죽을 수 있음을 알고 있습니다. 나는 적절한 신호 처리를 추가하여 작업자가 스스로 정리하고 작업이 중단 된 상태에서 적절한 위치에 남겨진 곳을 기록하도록합니다.

진드기와 pcntl_signal()을 사용하여 신호 처리를 활성화하는 방법을 알아 냈습니다. 현재 제 처리법이 정상적으로 작동하는 것 같습니다. 그러나 신뢰할 수 있는지 확인하기 위해 테스트하고 싶습니다. 초기의 통합 테스트를 작성했지만, 개발 과정에서 모든 종류의 이상한 경쟁 조건 문제가있어 핀 고정하기가 까다로웠 기 때문에 그다지 견고하지 못합니다.

필자의 시그마 처리가 강력하다는 자신감을 높이기 위해 PHPUnit 테스트에서 kill 신호를 보내는 방법에 대한 조언이나 지침이 필요합니다. 나의 현재 전략 :

  • 때 핵심 시스템은을 사용하여 시작됩니다
  • 작업을 죽일 모니터링하는 데 사용할 수는 다양한 종류의 로그 파일을 만들고 실행하는 핵심 시스템으로 phpunit을
  • 를 사용 PHPUnit 테스트에서 system() 명령을 사용하여 백그라운드에서 PHP 스크립트를 분리하십시오. 내 명령은 php script.php > $logFile 2>&1 &과 비슷합니다. 즉, 모든 출력을 로그 파일로 리디렉션 한 다음 백그라운드로 푸시하면 테스트 방법에서 모니터링 할 수 있습니다.
  • 백그라운드 스크립트는 해당 PID를 파일로 작성하여
  • 이것은 반복적으로 스캔하여 검사에 의해 안정적으로 포착되고 usleep는 스캔 사이에 보내고
  • 시험은 다음 스캔 사이에 보내고, usleep을 데이터베이스를 검색하고 준비 때 kill <pid>을 실행하여 특정 상태를 기다립니다
  • 그런 다음 신호 처리기가 시작되어 새 데이터베이스 상태 인 usleep이 다시 입력 될 때까지 기다렸다가 햄을 피합니다.
  • 마지막으로 최대 지연 시간 후에 데이터베이스가 올바른 상태인지 아닌지를 결정합니다.이 지연 시간은 테스트를 통과하거나 실패합니다.

물론이 모든 대기/확인을 통해 모든 종류의 경쟁 조건에 대해 약간의 ropey 느낌과 상당히 익숙해졌습니다. 현재의 느낌은 테스트가 약 2 %의 시간 실패하지만, 테스트를 하루 정도 실패 할 수는 없었습니다. 몇 가지 침수 테스트를 계획하고 있으며 그 중 일부 테스트가 실패하면 여기에 게시 할 예정입니다.

내가 테스트를 수행하는 시스템에 kill 자체로 요청하여 간단하게 만들 수 있는지 궁금해합니다. 두 가지 수준의 대기 확인이 제거됩니다 (하나는 PID를 기다리고 다른 하나는 데이터베이스가 올바른 상태가 될 때까지 기다리는 것입니다). kill 명령 전) . 그것은 kill이 발행 된 후에도 wait-check 루프를 남겨 둡니다 만, 실제로 한 검사가 실제로 문제가되지 않는다는 것을 알 수 있습니다.

나는 말하기를, 나는 나의 모든 접근법이 허풍을 벗을지도 모른다는 것을 알고 있으며, 이런 종류의 일을하는 더 나은 접근법이있다. 어떤 아이디어? 현재 PHPUnit이 이상한 지연을 초래할 경우 기다리는 시간 초과를 늘리는 것이 내 생각입니다. 또한 로그를 검사하는 데 실패 할 수 있는지 확인할 것입니다.


† 아쉽게도 많은 일을 단순화하지 않습니다. 난 그냥 믿을만한 것으로 간주 간단한 신호 통합 테스트에서 이것을 시도하고 배경이 system() 즉시 반환하기 때문에, 그것은 여전히 ​​적절한 로그 레코드를 식별하고 오른쪽 post-kill 결과를 확인하기 위해 루프 대기해야합니다. 그러나 더 이상 PID가 임시 파일에 기록 될 때까지 기다릴 필요가 없으므로 적어도 하나의 루프가 제거됩니다.

+0

아마도 넓은 의미입니다. –

+0

누군가가 어떻게 가장자리의 경우라고 생각하는지 알 수 있습니다. 그럼에도 불구하고 역설적으로 너무 자세하게 설명했기 때문에 너무 광범위하게 보일 수 있을지 궁금합니다. 요컨대, Posix 신호가 더 신뢰성있는 테스트를 수행 할 수있는 방법을 요구하고 있습니다. 여기에있는 누군가가 경험을 쌓기를 바라고 있습니다. 우리가 볼거야 ... – halfer

답변

-1

질문에서 언급했듯이 내가 시도한 첫 번째 안정성 변화는 작업자 작업에 kill을 실행하는 기능을 주입하는 것이 었습니다. 필자의 경우에는 시스템에 내장되어 있지만 독자는 자식 테스트 클래스를 작성하고 DI 구성을 변경하는 것이 편리한 방법이라는 것을 알 수 있습니다.

이것은 안정성이 좋은 것으로 보입니다. 원래,이 시험에서 몇 가지 대기 루프했고, 테스트가 바로 그 순간에 kill을 실행해야합니다 : 아이의 PID에 대한

  1. 기다립니다 아이 로그 파일에 사용할 수
  2. 대기되기 위해 이 신호 처리기가 문제가되어 왔습니다 수

제대로 실행 표시하기 위해

  • 문제 아이 로그 파일의 kill
  • 대기를 죽일 준비가되어 나타냅니다 (2) -이 값이 너무 짧으면 kill이 너무 늦게 도착하여 안정적인 최대 대기 시간이 발견 되더라도 CPU가 예기치 않은 부하를받는 경우 여전히 실패 할 가능성이 있습니다.

    PHPUnit 테스트를 반복적으로 실행하기위한 빠른 스크립트를 작성했습니다 (200 회 반복 또는 첫 번째 실패 중 빠른 날짜 적용). 이제 200 회 반복됩니다. 따라서 테스트 신뢰도가 올라간 것으로 간주합니다. 그러나이 변경 사항이 있으면 여기에서 업데이트 할 것입니다. 아마도 높은 nice의 테스트를 실행하면 오류가 발생할 것입니다.

    기타 답변은 여전히 ​​환영합니다.