1. 오류보고 : "거래 내에서 PDO 인스턴스를 교환 할 수 없습니다"
Laravel 소스 코드를 쿼리하면 setPdo 메소드에서 예외가 발생했는지 확인할 수 있습니다.
<? phppublic function setpdo ($ pdo) {if ($ this-> transactions> = 1) {새로운 runtimeexception ( "트랜잭션 내에서 인스턴스를 교체 할 수 없음"); } $ this-> pdo = $ pdo; $ this;}?>를 반환합니다 말 그대로,이 오류는 트랜잭션이 켜져있을 때 데이터베이스 연결이 전환되므로 발생합니다. 그러나 때로는 코드가 데이터베이스 연결을 명시 적으로 전환하지 않더라도이 오류가 발생할 수 있습니다. 예를 들어, 쿼리 문을 실행할 때 오류가 발생하면 시스템은 tryAgainIfCausedByLostConnection 메서드를 사용하여 문제가 연결 손실로 인해 발생하는지 여부를 결정합니다. 그렇다면 시스템은 reconnect 메소드를 통해 다시 연결됩니다. 다시 연결하면 시스템은 disconnect 방법을 통해 일부 청소 작업을 수행하며 setPdo 메소드가 호출됩니다.
원인과 결과를 명확히 한 후에는 문제를 해결하는 방법을 자연스럽게 알게됩니다. 네트워크 상황을 확인하고 데이터베이스 연결 손실의 원인을 확인하십시오. 특정 장치에 문제가 있거나 timeout 설정이 부적절하기 때문일 수 있습니다. 비교적 dirty 방법은 데이터베이스에 쿼리 및 다시 연결하기 전에 DB::reconnect() 메소드를 실행하는 것입니다.
2. 오류 : "작업을 삭제할 수 없음 : Not_Found"
이 문제는 실제로 Laravel과 관련이 없지만 대기열 서비스 Beanstalk에 의해 발생합니다.
Beanstalk
이 문제를 해결하려면 먼저 메시지의 수명주기를 이해해야합니다. 메시지가 큐에 배치되면 READY 상태로 들어가고 동시에 TTR(time to run) 타이머를 연관하여 메시지가 실행되는 시간을 나타냅니다. 이 메시지가 소비되면 RESERVED 상태로 들어갑니다. 소비 후 메시지가 삭제됩니다. 소비 시간이 TTR 보다 너무 길면, 시스템은 소비자가 끊어 졌다고 생각한 다음 RESERVED 상태에서 READY 상태로 메시지를 반환하여 재 처리를 위해 다른 소비자에게 넘겨줍니다. 따라서 여러 소비자가 동일한 메시지를 처리 할 수 있습니다. 처리 한 최초의 소비자는 메시지를 정상적으로 삭제할 수 있지만 다른 소비자는 메시지를 삭제할 때 삭제할 수없는 오류를보고합니다.
솔루션은 매우 간단합니다. 첫째, TTR 설정이 너무 작을 수 없도록해야합니다. 둘째, Beanstalk 실제로 실행 시간이 너무 긴 문제를 해결하기 위해 특수 touch 명령을 제공합니다. 또한 때로는 여러 소비자가 동일한 메시지를 처리하는 상황을 피하기 위해 응용 프로그램 수준에서 고정해야 할 수도 있습니다.
3. 오류보고 : "모델에 대한 쿼리 결과 없음"
Laravel 읽기 및 쓰기 분리가 활성화되면 소비자는 메시지를 처리 할 때 유사한 오류를받을 수 있습니다. 잠재적 인 문제가있는 큐 명령은 대략 다음과 같습니다.
<? phpclass foo 확장 명령 구현 셀프 핸들링,해야합니다. 보호 된 $ bar; 공개 함수 __construct ($ id) {$ this-> bar = bar :: find ($ id); } public function handle () {// $ this-> bar}}?> 마스터 슬레이브 지연으로 인해 Laravel 읽기 및 쓰기 분리가 켜지면 해당 데이터를 쿼리하지 못할 수 find . 여기서 분석 한 후에는 쓰기 방법이 다음으로 수정 될 가능성이 높습니다.
<? phpclass foo 확장 명령 구현 셀프 핸들링,해야합니다. 보호 된 $ bar; public function __construct ($ id) {$ this-> bar = bar :: onwriteConnection ()-> find ($ id); } public function handle () {// $ this-> bar}}?> 즉, 쿼리는 Laravel의 onWriteConnection 메소드를 통해 기본 서버에 고정되어 있지만 실제로는 유효하지 않습니다. 문제의 요점은 사막화가 서버에서 findOrFail 호출한다는 것입니다.
<? phpprotected function getRestoredPropertyValue ($ value) {return $ value instanceof ModelIdentifier? (new $ value-> class)-> findorFail ($ value-> id) : $ value;}?> 우리는 프레임 워크를 HACK 수 없기 때문에 onWriteConnection 의미가 없습니다. 실제로 다른 관점에서 문제를 살펴보십시오. 직렬화되는 한 데이터베이스 객체를 속성으로 사용하지 마십시오.
<? phpclass foo 확장 명령 구현 셀프 핸들링,해야합니다. 보호 된 $ id; 공개 함수 __construct ($ id) {$ this-> id = $ id; } public function hone () {$ bar = bar :: onwriteConnection ()-> find ($ this-> id); }}?>4. 요약
위의 것은 Laravel을 사용할 때 발생한 몇 가지 대표 오류 보고서 및 솔루션입니다. 궁금한 점이 있으면 자유롭게 의사 소통을하십시오. 이 기사가 모든 사람의 연구 나 업무에 도움이되기를 바랍니다.