Câu trả lời:
Cập nhật : Sự cố đã được khắc phục trong Composer 1.3 . Cập nhật trình soạn nhạc lên phiên bản mới nhất bằng cách thực thi composer self-update
, thay vì thử cách giải quyết sau.
Đây là sửa đổi của tôi về mã của @ ezzatron. Tôi đã cập nhật tập lệnh để phát hiện các tệp ini từ đầu ra phpinfo.
#!/bin/sh
php_no_xdebug () {
temporaryPath="$(mktemp -t php.XXXX).ini"
# Using awk to ensure that files ending without newlines do not lead to configuration error
php -i | grep "\.ini" | grep -o -e '\(/[a-z0-9._-]\+\)\+\.ini' | grep -v xdebug | xargs awk 'FNR==1{print ""}1' | grep -v xdebug > "$temporaryPath"
php -n -c "$temporaryPath" "$@"
rm -f "$temporaryPath"
}
php_no_xdebug /usr/local/bin/composer.phar $@
# On MacOS with composer installed using brew, comment previous line
# Install jq by executing `brew install jq` and uncomment following line.
# php_no_xdebug /usr/local/Cellar/composer/`brew info --json=v1 composer | jq -r '.[0].installed[0].version'`/libexec/composer.phar $@
bin/bash
thay vì /bin/sh
, vì sau này không thích function
từ khóa (Ubuntu 14.04 LTS).
composer self-update
Lệnh này sẽ vô hiệu hóa mô-đun PHP5 Xdebug cho CLI (và do đó là trình tổng hợp):
sudo php5dismod -s cli xdebug
Nó loại bỏ liên kết tượng trưng xdebug.ini khỏi/etc/php5/cli/conf.d/
Điều này đã được đề xuất trên http://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/
Lưu ý rằng đối với Ubuntu 16.04, bạn có thể cần chạy nó như sau:
sudo phpdismod -s cli xdebug
alias xdebug-on='sudo php5enmod -s cli xdebug'
và alias xdebug-off='sudo php5dismod -s cli xdebug'
, vì vậy bây giờ thật dễ dàng để bật xdebug-on
và tắt xdebug-off
xdebug.
Tôi không nghĩ rằng có một tùy chọn để định cấu hình PHP để nó có thể tải các cấu hình khác nhau theo tập lệnh được nhắm mục tiêu. Ít nhất, không phải là không sao chép các tệp .ini ...
Tuy nhiên, bạn có thể thêm các tùy chọn thoses khi chạy trình soạn nhạc với php:
php -n -d extension=needed_ext.so composer.phar
-n
sẽ yêu cầu PHP bỏ qua bất kỳ php.ini nào. Điều này sẽ ngăn xdebug tải cho chính lệnh này.
-d
tùy chọn cho phép bạn thêm bất kỳ tùy chọn nào bạn muốn (đối với exemple, kích hoạt need_ext.so). Bạn có thể sử dụng nhiều -d
tùy chọn. Tất nhiên, đây là tùy chọn, bạn có thể không cần.
Sau đó, bạn có thể tạo một bí danh để làm cho nó có đường trở lại.
Một giải pháp điển hình (vì nhà soạn nhạc cần json):
php -n -d extension=json.so composer.phar
greg0ire> giải pháp của tôi, dựa trên đó:
#!/bin/bash
options=$(ls -1 /usr/lib64/php/modules| \
grep --invert-match xdebug| \
# remove problematic extensions
egrep --invert-match 'mysql|wddx|pgsql'| \
sed --expression 's/\(.*\)/ --define extension=\1/'| \
# join everything together back in one big line
tr --delete '\n'
)
# build the final command line
php --no-php-ini $options ~/bin/composer $*
alias composer=/path/to/bash/script.sh
Nó trông xấu xí (tôi đã thử và không làm được điều đó với xargs), nhưng hoạt động… Tuy nhiên, tôi phải tắt một số tiện ích mở rộng, nếu không tôi nhận được các cảnh báo sau:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/php/modules/mysqli.so: undefined symbol: mysqlnd_connect in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_mysql.so' - /usr/lib64/php/modules/pdo_mysql.so: undefined symbol: pdo_parse_params in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/pdo_pgsql.so' - /usr/lib64/php/modules/pdo_pgsql.so: undefined symbol: pdo_parse_params in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/wddx.so' - /usr/lib64/php/modules/wddx.so: undefined symbol: php_XML_SetUserData in Unknown on line 0
-n
ngày hôm qua và gặp sự cố vì tôi thiếu phar
tiện ích mở rộng. Tôi sẽ thử thêm nhiều tiện ích mở rộng khác cho đến khi nó hoạt động, tôi nghĩ đây là một giải pháp tốt. Theo bí danh, tôi đã có một số bí danh zsh mà tôi không duy trì. Có lẽ tôi sẽ cố gắng thay thế nhị phân bằng một tập lệnh bash hoặc xem liệu tôi có thể định cấu hình bí danh hay không.
composer.json
, ví dụ: "ext-ldap": "*" hoặc đơn giản là tùy thuộc vào những gì cần thiết để làm cho các tác vụ cài đặt bài đăng chạy đúng cách ... Nếu chỉ có một cách để danh sách đen một phần mở rộng ...
php -m
diagnose
, và kể từ khi tôi đang xây dựng container Docker phát triển cho đội của tôi, việc cải thiện tốc độ nhỏ nhất có thể mang lại lợi ích cho tất cả trong số họ
Bằng cách tạo một bí danh, bạn sẽ ngăn chặn điều đó composer
xdebug
báo lỗi .
Chỉ cần thêm dòng này vào ~/.bash_aliases
trong hệ thống của bạn và nó sẽ hoạt động hoàn hảo.
alias composer="php -n /usr/local/bin/composer"
Tải lại shell để composer
cung cấp bí danh mới .
source ~/.bash_profile
SỬ DỤNG:
$ composer --version
LƯU Ý:
Bạn không nhất thiết phải sử dụng bất kỳ tham số nào khác.
Tùy thuộc vào hệ thống của bạn, bạn có thể có một .bashrc
thay thế .bash_profile
.
CẬP NHẬT:
Như @AlexanderKachkaev đã đề cập trong các nhận xét, không có gì đáng để thêm memory_limit như sau để tránh bị rơi vào một số tình huống:
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
-n
tùy chọn vô hiệu hóa Phar
phần mở rộng để nó có thể thất bại để chạy từcomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
Tôi đã đưa ra một câu trả lời hoạt động khá tốt cho OSX và có thể được điều chỉnh cho bất kỳ phiên bản PHP nào tải các phần mở rộng của nó bằng cách sử dụng các tệp .ini riêng lẻ trong "ini dir bổ sung":
#!/bin/sh
function php-no-xdebug {
local temporaryPath="$(mktemp -t php-no-debug)"
find /opt/local/etc/$1/php.ini /opt/local/var/db/$1/*.ini ! -name xdebug.ini | xargs cat > "$temporaryPath"
php -n -c "$temporaryPath" "${@:2}"
rm -f "$temporaryPath"
}
alias composer="php-no-xdebug php56 ~/bin/composer"
Tôi thường tạo một tập lệnh shell cho mỗi dự án, vì mỗi dự án đều có một phiên bản PHP khác. Đó là trong một /bin/
thư mục bên cạnh composer.phar
và composer.json
và tôi chạy nó như./bin/composer
trong thư mục dự án của tôi.
Nó trông giống như thế này (cho php56)
#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
COMPOSER_DISABLE_XDEBUG_WARN=1 /opt/local/bin/php56 \
-d xdebug.remote_enable=0 -d xdebug.profiler_enable=0 \
-d xdebug.default_enable=0 $DIR/../composer.phar "$@"
Các -d
tùy chọn vô hiệu hóa xdebug một cách hiệu quả. CácCOMPOSER_DISABLE_XDEBUG_WARN=1
vô hiệu hóa các vấn đề về trình soạn nhạc cảnh báo.
Việc tắt phần mở rộng xdebug được ưu tiên (xem gỡ rối về trình soạn nhạc ), nhưng cá nhân tôi thích tập lệnh đơn giản hơn.
Một số thời gian trên máy của tôi: 2 Chạy với xdebug và ini được kích hoạt: 1m33
Chạy với xdebug nhưng ini bị tắt: 0m19
Chạy mà không cần xdebug: 0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
: nếu bạn nhận được cảnh báo, điều đó chỉ có nghĩa là scrit của bạn không hoạt động. Việc xác định xdebug.remote_autostart
dường như vô ích nếu tính năng gỡ lỗi từ xa bị tắt.
xdebug.remote_autostart
. Về hiệu quả của script: Composer kiểm tra xem phần mở rộng xdebug có được tải hay không, chứ không phải nếu nó thực sự làm bất cứ điều gì, hãy xem mã ở đây . Các tùy chọn ini làm việc tốt trong các kịch bản php "thường xuyên" nhưng một lần nữa: tôi đã thực hiện không kiểm tra hiệu suất ...
Nếu bạn sử dụng PHPStorm, bản phát hành mới nhất (2016.2) đi kèm với tính năng bật XDebug cho các tập lệnh CLI theo yêu cầu, có nghĩa là bạn có thể chỉ cần tắt XDebug trên toàn cầu trên máy phát triển của mình. IDE sẽ kích hoạt nó ngay lập tức khi nó cần thiết bằng mã bên trong các dự án của bạn.
PhpStorm 2016.2 giới thiệu chế độ Xdebug Theo yêu cầu, nơi bạn có thể tắt Xdebug để cài đặt PHP toàn cầu của mình và PhpStorm sẽ chỉ bật nó khi cần - khi bạn gỡ lỗi tập lệnh của mình hoặc khi bạn cần báo cáo về mức độ mã.
Bạn cần chỉnh sửa tùy chọn Trình thông dịch PHP của mình để bao gồm đường dẫn đến XDebug, như được mô tả trong bài viết được liên kết.
Đối với tôi, đây có vẻ là giải pháp hoàn hảo, vì tôi thường chỉ muốn XDebug khi tôi đang ở trong IDE.
Tuy nhiên XDebug có những cách sử dụng tiềm năng khác khi bạn ở "ngoại tuyến", ví dụ như kết xuất ngăn xếp mở rộng trong nhật ký lỗi, mà bạn sẽ mất bằng cách tắt nó trên toàn cầu. Tất nhiên, bạn không nên bật XDebug khi sản xuất, vì vậy điều này sẽ được giới hạn trong các trường hợp sử dụng như tập lệnh CLI thử nghiệm hoặc thử nghiệm tự động trong quá trình phát triển.
Thay vì bối rối với việc bật hoặc tắt tạm thời mô-đun PHP, khi bạn có thể có các quy trình đồng thời sử dụng PHP (ví dụ như một phần của đường ống CI), bạn có thể yêu cầu PHP trỏ đến một thư mục tải mô-đun khác.
Mặc dù điều này tương tự như một số giải pháp được đề cập ở trên, nhưng điều này giải quyết một số trường hợp cạnh, rất hữu ích khi được sử dụng bởi Jenkins hoặc người chạy CI khác chạy các thử nghiệm đồng thời trên cùng một máy.
Cách dễ nhất để làm điều này là sử dụng biến môi trường PHP_INI_SCAN_DIR
Sử dụng điều này trong một tập lệnh hoặc tác vụ xây dựng rất dễ dàng:
export PHP_INI_SCAN_DIR=/etc/php.d.noxdebug
php composer install
Tất nhiên, trước tiên bạn sẽ muốn chuẩn bị /etc/php.d.noxdebug, làm những việc như:
mkdir /etc/php.d.noxdebug
cp /etc/php.d/* /etc/php.d.noxdebug
rm /etc/php.d.noxdebug/xdebug.ini
Điều này có nghĩa là bạn có một môi trường tương tự như môi trường php cũ, chỉ thiếu một mô-đun. Có nghĩa là bạn không cần phải lo lắng về việc cần tải các mô-đun phar / json như khi bạn làm với giải pháp php -n.
Tôi đã nghĩ ra một giải pháp cho trình cài đặt Composer dựa trên Windows - nó sẽ hoạt động cho mọi cài đặt Composer, về cơ bản nó chỉ tạo một bản sao của tệp INI đã tải và nhận xét phần mở rộng xdebug zend, sau đó tải tệp cấu hình đó khi nó chạy trình soạn .
Tôi đã mở một vấn đề để xem liệu họ có muốn tích hợp thay đổi này hay không:
https://github.com/composer/windows-setup/issues/58
Bạn có thể tìm thấy hướng dẫn và mã của tôi ở đó.
Như đã lưu ý trong câu trả lời của Joyce , vấn đề này không còn tồn tại trong phiên bản mới nhất của Composer.
Tài liệu của Nhà soạn nhạc đã được cập nhật để lưu ý điều này . Nó hướng dẫn chi tiết cách bạn có thể kích hoạt xdebug với Composer (nếu cần).
Bạn có thể cập nhật phiên bản Composer của mình bằng cách sử dụng tính năng tự cập nhật .
Trên máy Mac của tôi, tôi phải làm: sudo php /opt/local/bin/composer self-update
Bạn có thể tìm thấy thêm chi tiết về điều này trong bối cảnh cài đặt Homebrew PHP trong số này .
Đây là đóng góp của tôi dựa trên Homebrew cài đặt PHP do cài đặt trên Mac OS X.
Đó là một trình bao bọc tập lệnh shell, được thiết kế để lưu dưới dạng tệp thực thi tại /usr/local/bin/composer
, với tệp nhị phân Composer tại /usr/local/bin/composer.phar
:
#!/bin/sh
sed -i '' -e 's:zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":;zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":' /usr/local/etc/php/5.5/conf.d/ext-xdebug.ini
/usr/local/bin/php /usr/local/bin/composer.phar "$@"
sed -i '' -e 's:;zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":zend_extension="/usr/local/opt/php55-xdebug/xdebug.so":' /usr/local/etc/php/5.5/conf.d/ext-xdebug.ini
Tập lệnh trình bao bọc:
Tập lệnh được kết hợp với bản cài đặt OS X / Homebrew của PHP 5.5. Các đường dẫn phải được điều chỉnh để hoạt động với các phiên bản PHP khác và bố cục thư mục của hệ điều hành và trình quản lý gói khác. Cũng lưu ý rằng một số phiên bản của sed không cần đối số chuỗi rỗng theo sau -i
tùy chọn.
Tập lệnh rất đơn giản, ở chỗ nó hoạt động trực tiếp trên các tệp cấu hình PHP chính, tuy nhiên đây cũng là một nhược điểm: Xdebug cũng sẽ bị vô hiệu hóa đối với bất kỳ tập lệnh nào được thực thi đồng thời với tập lệnh này.
Trong môi trường phát triển của tôi, đây là một sự đánh đổi có thể chấp nhận được, vì Composer được thực thi theo cách thủ công và chỉ thỉnh thoảng; tuy nhiên bạn có thể không muốn sử dụng kỹ thuật này nếu thực thi Composer như một phần của quy trình triển khai tự động.
Trong hầu hết các trường hợp, bạn không cần xdebug trên chế độ CLI. Nếu điều này là chấp nhận được đối với bạn, bạn có thể cấu hình cli và cgi khác nhau.
Vì vậy, nếu bạn tạo php-cli.ini và conf-cli.d gần thoát tệp php.ini thì bạn có thể định cấu hình cli và cgi khác nhau (đối với cgi, nó sẽ là php.ini và conf.d ). Chỉ cần không đặt xdebug.ini vào conf-cli.d.
Nếu bạn cài đặt trình soạn nhạc bằng brew trên OS X Bạn có thể sử dụng bí danh này:
alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"
Giải pháp nhanh chóng của tôi để cài đặt macports, với nhiều phiên bản PHP là viết trình bao bọc trình bao đơn giản này cho Composer:
/user/local/bin/composer-nodebug.sh
#!/bin/bash
sudo mv /opt/local/var/db/php53/xdebug.ini /opt/local/var/db/php53/xdebug.NOT
sudo mv /opt/local/var/db/php54/xdebug.ini /opt/local/var/db/php54/xdebug.NOT
sudo mv /opt/local/var/db/php55/xdebug.ini /opt/local/var/db/php55/xdebug.NOT
composer $1 $2 $3 $4 $5 $6 $7
sudo mv /opt/local/var/db/php53/xdebug.NOT /opt/local/var/db/php53/xdebug.ini
sudo mv /opt/local/var/db/php54/xdebug.NOT /opt/local/var/db/php54/xdebug.ini
sudo mv /opt/local/var/db/php55/xdebug.NOT /opt/local/var/db/php55/xdebug.ini
Sau đó chạy bất kỳ lệnh nào của trình soạn nhạc như sau:
sudo composer-nodebug.sh update
Hạn chế:
Không thanh lịch, nhưng đơn giản.
$1…$7
… có thể nó $@
hoặc một cái gì đó tương tự, bạn sẽ phải xem.
Tạo bí danh cho nhà soạn nhạc để tắt xdebug và ngăn lỗi bộ nhớ:
Thêm dòng này vào ~ / .bash_profile của bạn
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
Khởi động lại thiết bị đầu cuối để cung cấp bí danh mới.
Đây là giải pháp nhanh chóng của tôi để loại bỏ cảnh báo Xdebug trên phiên bản PHP5-cli. Tôi đã loại bỏ hỗ trợ của Xdebug cho PHP5-cli trên Ubuntu 14.04.
cd /etc/php5/cli/conf.d/
sudo rm 20-xdebug.ini
Bây giờ không còn cảnh báo Xdebug trên PHP5-cli.
sudo phpdismod xdebug
sẽ là phương pháp ưa thích để bruterm