Tôi đã gặp lỗi này sau khi cập nhật cài đặt PHP của tôi lên 5.5,14, trên RedHat EL v6. Tôi đã cài đặt PHP thông qua trình quản lý gói Yum và sau đó cần cài đặt lại một số tiện ích mở rộng PHP tôi đang sử dụng. Khi tìm kiếm lời khuyên về cách giải quyết vấn đề này, tôi đã bắt gặp câu hỏi này và bây giờ tôi đã phát hiện ra một giải pháp làm việc mà tôi muốn chia sẻ những phát hiện của mình ở đây. Các đề xuất khác mà tôi đã tìm thấy trực tuyến bao gồm xóa và cài đặt lại PECL / PEAR và ngay cả cài đặt PHP của tôi cũng không giải quyết được vấn đề này. Cuối cùng sau khi nghiên cứu và xem xét thêm mã nguồn cho PECL / PEAR, tôi đã tìm ra nguyên nhân thực sự. Hy vọng những gì sau đây sẽ giúp ích cho người khác:
Bạn có thể thấy lỗi này khi cố chạy PECL nếu cài đặt PHP của bạn không bật XML theo mặc định, nhưng thay vào đó, hỗ trợ XML thường được tải vào cài đặt PHP của bạn thông qua mô-đun mở rộng PHP (điều này có thể xảy ra nếu ./configure --disable-xml
cờ được chỉ định khi xây dựng PHP từ nguồn hoặc nếu bạn đã cài đặt PHP thông qua các trình quản lý gói khác nhau, nơi bản dựng PHP đó được cấu hình để tải XML thông qua một mô-đun mở rộng).
Lưu ý cách dòng cuối cùng của đầu ra lỗi từ PECL là XML Extension not found
- lý do lỗi này xuất hiện là do khi PECL cố gắng sử dụng lớp XMLParser.php của nó, nó không thể truy cập vào phần mở rộng XML (nó kiểm tra mô-đun XML bằng cách sử dụng extension_loaded('xml')
xung quanh dòng 259 nguồn XMLParser.php) và do mô-đun XML không khả dụng, nên nó không thể phân tích các tệp cấu hình / cài đặt của nó và xuất ra tất cả các lỗi khác được thấy ở trên.
Lý do vấn đề này xảy ra là do cách PECL vận hành. Bản thân lệnh PECL chỉ là một tập lệnh shell, đầu tiên tìm ra PHP được cài đặt trên hệ thống của bạn và sau đó gọi PHP trên dòng lệnh với một số cờ trước khi cung cấp đường dẫn đến tệp tập lệnh PHP PECL chính. Cờ vấn đề mà tập lệnh shell PECL đang sử dụng là -n
tùy chọn, yêu cầu PHP bỏ qua bất kỳ php.ini
tệp nào (và do đó PHP sẽ không tải bất kỳ phần mở rộng bổ sung nào mà php.ini
tệp của bạn chỉ định, kể cả trong trường hợp XML này).
Người ta có thể thấy tác động của -n
cờ bằng cách chạy hai lệnh sau:
- Đầu tiên hãy thử chạy
php -m
trên dòng lệnh
- sau đó so sánh đầu ra với
php -n -m
Bạn không nên thấy phần mở rộng XML được liệt kê khi bạn chạy lệnh thứ hai vì -n
cờ đã bảo PHP không phân tích cú pháp php.ini
tệp của chúng tôi .
Nếu bạn chạy vi `which pecl`
trên dòng lệnh, bạn sẽ thấy nội dung của lệnh PECL (như đã lưu ý ở trên, nó chỉ là một tập lệnh shell) và nếu bạn kiểm tra dòng cuối cùng, bạn sẽ thấy một cái gì đó như sau:
exec $PHP -C -n -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d safe_mode=0 -d register_argc_argv="On" $INCDIR/peclcmd.php "$@"
Bạn sẽ thấy -n
cờ được liệt kê giữa -C
và -q
cờ. Nếu bạn chỉnh sửa tập lệnh shell PECL, bỏ qua -n
cờ bạn sẽ có thể chạy lại PECL mà không gặp vấn đề gì.
Ngoài ra, bạn có thể biên dịch lại PHP từ nguồn đảm bảo rằng mô-đun XML được biên dịch thành nhị phân PHP thay vì được tải từ mô-đun mở rộng PHP vào thời gian chạy. Rõ ràng việc chỉnh sửa tập lệnh shell PECL để xóa -n
cờ sẽ chỉ khắc phục sự cố cho đến khi PECL / PEAR được cài đặt lại, hy vọng các nhà bảo trì của PECL / PEAR có thể cập nhật repo của họ với bản sửa lỗi này. Đảm bảo PHP được xây dựng với sự hỗ trợ XML được biên dịch, tuy nhiên là một sửa chữa lâu dài cho giải pháp, nhưng có thể không lý tưởng cho hoàn cảnh của mọi người.
Nói một cách chính xác, nếu bạn chạy, vi `which pear`
bạn sẽ thấy một tập lệnh shell rất giống với tập lệnh mà PECL sử dụng, tuy nhiên -n
cờ bị thiếu trong lệnh gọi PHP và vì vậy lệnh PEAR không phải chịu các vấn đề tương tự.