Lệnh PECL tạo ra danh sách dài các lỗi


47

Hiện đang chạy PHP 5.4 trên CentOS 6.5.

Tôi đã cài đặt gói webtatic php55w sau đó cài đặt PEAR + PECL mà không gặp vấn đề gì với redis và mongo thông qua PECL.

Không lâu sau, tôi nhận ra 5.5 không tương thích với khung công tác tôi đang làm việc nên tôi đã xóa php55w và cài đặt php54w vào vị trí của nó.

Bây giờ lệnh pecl hoàn toàn không hoạt động. Nó chỉ tạo ra chuỗi lỗi thực sự dài này mỗi lần tôi đưa ra bất kỳ lệnh pecl nào (viết tắt ... lặp đi lặp lại hàng chục lần):

Warning: Invalid argument supplied for foreach() in Command.php on line 259

Warning: Invalid argument supplied for foreach() in /usr/share/pear/PEAR/Command.php on line 259

...etc etc etc...

Notice: Undefined index: honorsbaseinstall in Role.php on line 180

Notice: Undefined index: honorsbaseinstall in Role.php on line 180

...etc etc etc...

Notice: Undefined index: installable in Role.php on line 145

Notice: Undefined index: installable in Role.php on line 145

...etc etc etc...

Notice: Undefined index: phpfile in Role.php on line 212

Notice: Undefined index: phpfile in Role.php on line 212

...etc etc etc...

Notice: Undefined index: config_vars in Role.php on line 49

Notice: Undefined index: config_vars in Role.php on line 49

...etc etc etc...

Warning: Invalid argument supplied for foreach() in PEAR/Command.php on line 259

Warning: Invalid argument supplied for foreach() in /usr/share/pear/PEAR/Command.php on line 259

...etc etc etc...

XML Extension not found

Làm thế nào tôi có thể sửa lỗi này?

Câu trả lời:


91

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-xmlcờ đượ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à -ntùy chọn, yêu cầu PHP bỏ qua bất kỳ php.initệ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.initệ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 -ncờ bằng cách chạy hai lệnh sau:

  • Đầu tiên hãy thử chạy php -mtrê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ì -ncờ đã bảo PHP không phân tích cú pháp php.initệ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 -ncờ được liệt kê giữa -C-qcờ. Nếu bạn chỉnh sửa tập lệnh shell PECL, bỏ qua -ncờ 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 -ncờ 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 -ncờ 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ự.


5
Câu trả lời sử thi, chỉnh sửa kịch bản pecl làm việc cho tôi.
Alex Ross

29
Thưa ngài ... là một vị thánh. ... ... thật sự, rõ ràng. Tôi sẽ viết một kịch bản quét các cáo phó của mỗi tờ báo, và ngay khi bạn qua đời, tôi sẽ nói với Vatican để bắt đầu quá trình phong chân phước, sử dụng câu trả lời này như một ví dụ về hành động của bạn trên trái đất. Câu trả lời tuyệt vời :)
riwalk

5
Cảm ơn. TLDR; chỉnh sửa dòng cuối cùng /usr/bin/peclđể không sử dụng tham số -n.
dtbarne

7
Chạysed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer 19/07/2016

6
Tôi không có -nlệnh cuối cùng peclvà danh sách dài các lỗi vẫn không may
trắng trong các bản trống

29

Tôi vừa gặp phải vấn đề này trên Ubuntu khi tôi gọi lệnh PECL. Điều duy nhất giúp tôi là cài đặt php-xmlgói. Trước tiên hãy kiểm tra xem bạn đã cài đặt mô-đun XML chưa

php -m

Nếu bạn không tìm thấy nó thì bạn phải

sudo apt-get install php-pear

nó sẽ tự động cài đặt gói php-xml. hoặc bạn chỉ có thể cài đặt xml như thế này (tùy thuộc vào phiên bản php bạn có)

sudo apt-get install php-xml php7.0-xml

Nếu bạn tìm thấy xml thì bạn đã gỡ bỏ nó và cài đặt lại

sudo apt-get purge php*-xml
sudo apt-get autoremove php*-xml
sudo apt-get install php-xml php7.0-xml

Nếu bạn có RPM làm trình quản lý gói, bạn có thể sử dụng yum install php-xmlyum remove php-xml


1
php-xml php7.0-xml được cài đặt nhưng mô-đun XML không có ở đây
Loenix

Câu trả lời tuyệt vời nó đã giúp tôi
Syed Aqeel

8

Tôi đang sử dụng php5.6.

Nhiều câu trả lời khuyên bạn nên cài đặt php-xml, nhưng nó không hoạt động với tôi, khi tôi gõ phiên bản cụ thể như

sudo apt-get install php5.6-xml

và mọi thứ hoạt động, có thể nó sẽ giúp người khác.


hoạt động cho php 5.6
devst3r

Làm việc cho tôi trong php 7.2, Ubuntu 16.04. Lệnh của tôi là : sudo apt install php7.2-xml. Bạn có thể cập nhật câu trả lời để bao gồm lệnh của tôi nếu bạn muốn :) cảm ơn bạn
voghDev

4

bạn phải cài đặt gói php-xml để khắc phục sự cố "Không tìm thấy tiện ích mở rộng XML"


2
Một chút giải thích có thể hữu ích ở đây.
kasperd

Xin lưu ý rằng câu hỏi này đã gần 2 tuổi. Cố gắng tránh trả lời các câu hỏi cũ vì nó làm tắc màn hình chính.
Catherine MacInnes

1
Lý do tôi trả lời là hôm nay tôi gặp phải vấn đề này và giải pháp này đã giải quyết được vấn đề của tôi!
kavehmb

đây là điều duy nhất chúng tôi phải làm, vì tôi đang sử dụng php7.2và tôi không chỉnh sửa bất kỳ tập tin nào chỉ cài đặt phiên bản tương đối của tôi bằng lệnhsudo apt-get install php7.2-xml
Muhammad Omer Aslam

2

Loại bỏ hoàn toàn bất kỳ RPM PEAR nào, sau rm -rf /usr/share/pear/đó cài đặt lại lê và tất cả các mô-đun của bạn.


Theo đó lên yum erase php-pearvà bây giờ tất cả là tốt! Cảm ơn! :)
eComEvo

1
Xin lưu ý sử dụng phiên bản php54w của lê lê khi cài đặt lại (thay vì gói php-lê lê). Vì vậy, trong ngắn hạn 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop

2

Các bước sau đây làm việc cho tôi.

1 bước:

yum erase php-pear

2 bước:

# rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

3 bước:

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear

0

Người PHP7 / Debian (tương tự / lý do tương tự):

Lý do cho điều đó là, làm thế nào đề cập ở trên, phần mở rộng XML bị thiếu. Phải của chúng tôi sẽ sử dụng dotdeb và xml đã bị xóa khỏi việc tích hợp thành một gói riêng biệt:

nguồn: https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

Cũng xin lưu ý rằng bcmatch, dba, mbopes, xà phòng, xml và zip hiện có các gói chuyên dụng riêng.

Điều này có nghĩa rằng

php -n

sẽ không còn bao gồm xml, trình phân tích cú pháp gói PEAR phụ thuộc vào (trình phân tích cú pháp XML). Nguồn pear.php.net/package/PEAR/d Download

Tiện ích mở rộng PHP: xml

Vì điều quan trọng đối với pecl là không sử dụng php.ini của hệ thống, để đảm bảo chức năng trong mọi trường hợp (ngay cả khi sự bất thường là lý do bạn chạy pecl ..), nó sẽ không thay đổi khi sử dụng -n .. thay vì các anh chàng dotdeb cần để cuối cùng dừng đóng gói lại, tái cấu trúc và chuyển các gói arround mà không cần kiểm tra một chút.

Ngoài ra còn có một vấn đề với gói PEAR được vận chuyển, cần được nâng cấp với ... không được phép đăng bất cứ điều gì khác do danh tiếng hiện tại

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.