เมื่อทำงานcomposer diagnose
ฉันได้รับข้อผิดพลาดต่อไปนี้:
โหลดส่วนขยาย xdebug ซึ่งอาจทำให้ Composer ช้าลงเล็กน้อย ขอแนะนำให้ปิดการใช้งานเมื่อใช้ Composer
ฉันจะปิดใช้งาน xdebug เฉพาะเมื่อฉันใช้งาน Composer ได้อย่างไร
เมื่อทำงานcomposer diagnose
ฉันได้รับข้อผิดพลาดต่อไปนี้:
โหลดส่วนขยาย xdebug ซึ่งอาจทำให้ Composer ช้าลงเล็กน้อย ขอแนะนำให้ปิดการใช้งานเมื่อใช้ Composer
ฉันจะปิดใช้งาน xdebug เฉพาะเมื่อฉันใช้งาน Composer ได้อย่างไร
คำตอบ:
อัพเดท : ปัญหาได้รับการแก้ไขในนักแต่งเพลงที่ 1.3 อัปเดตนักแต่งเพลงเป็นเวอร์ชันล่าสุดโดยดำเนินการcomposer self-update
แทนการลองวิธีแก้ปัญหาต่อไปนี้
นี่คือการแก้ไขโค้ดของ @ ezzatron ของฉัน ฉันได้อัปเดตสคริปต์เพื่อตรวจหาไฟล์ ini จากเอาต์พุต 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
เป็นมากกว่า/bin/sh
เพราะอันหลังไม่ชอบfunction
คีย์เวิร์ด (Ubuntu 14.04 LTS)
composer self-update
คำสั่งนี้จะปิดใช้งานโมดูล PHP5 Xdebug สำหรับ CLI (และด้วยเหตุนี้ผู้แต่ง):
sudo php5dismod -s cli xdebug
มันลบsymlink xdebug.iniออกจาก/etc/php5/cli/conf.d/
แนะนำในhttp://blog.lorenzbausch.de/2015/02/10/php-disable-xdebug-for-cli/
โปรดทราบว่าสำหรับ Ubuntu 16.04 คุณอาจต้องเรียกใช้สิ่งนี้:
sudo phpdismod -s cli xdebug
alias xdebug-on='sudo php5enmod -s cli xdebug'
และalias xdebug-off='sudo php5dismod -s cli xdebug'
ดังนั้นจึงเป็นเรื่องง่ายที่จะเปิดใช้งานxdebug-on
และปิดการใช้งานxdebug-off
xdebug
ฉันไม่คิดว่าจะมีตัวเลือกในการกำหนดค่า PHP ดังนั้นจึงสามารถโหลดการกำหนดค่าต่างๆตามสคริปต์เป้าหมายได้ อย่างน้อยก็ไม่ต้องทำซ้ำไฟล์. ini ...
อย่างไรก็ตามคุณสามารถเพิ่มตัวเลือกสิ่งเหล่านี้เมื่อเรียกใช้นักแต่งเพลงด้วย php:
php -n -d extension=needed_ext.so composer.phar
-n
จะบอกให้ PHP ละเว้น php.ini ใด ๆ สิ่งนี้จะป้องกันไม่ให้ xdebug โหลดสำหรับคำสั่งนี้
-d
ตัวเลือกอนุญาตให้คุณเพิ่มตัวเลือกที่คุณต้องการ (สำหรับตัวอย่างเปิดใช้งาน needed_ext.so) คุณสามารถใช้หลาย-d
ตัวเลือก แน่นอนว่านี่เป็นทางเลือกคุณอาจไม่จำเป็นต้องใช้
จากนั้นคุณสามารถสร้างนามแฝงเพื่อทำให้หวานอีกครั้ง
วิธีแก้ปัญหาทั่วไป (เนื่องจากผู้แต่งต้องการ json):
php -n -d extension=json.so composer.phar
greg0ire> โซลูชันของฉันขึ้นอยู่กับสิ่งนั้น:
#!/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
มันดูน่าเกลียด (ฉันลองใช้ xargs แล้วล้มเหลว) แต่ใช้งานได้ ... ฉันต้องปิดการใช้งานส่วนขยายบางส่วนมิฉะนั้นฉันจะได้รับคำเตือนต่อไปนี้:
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
เมื่อวานนี้และมีปัญหาเพราะฉันไม่มีphar
ส่วนขยาย ฉันจะพยายามเพิ่มส่วนขยายให้มากขึ้นเรื่อย ๆ จนกว่าจะใช้งานได้ฉันคิดว่านี่เป็นทางออกที่ดี ตามนามแฝงฉันมีนามแฝง zsh ที่ฉันไม่ได้ดูแลอยู่แล้ว บางทีฉันอาจจะลองแทนที่ไบนารีด้วยสคริปต์ทุบตีหรือดูว่าฉันสามารถกำหนดค่านามแฝงได้หรือไม่
composer.json
เช่น "ext-ldap": "*" หรือขึ้นอยู่กับสิ่งที่จำเป็นในการทำให้งานหลังการติดตั้งทำงานได้อย่างถูกต้อง …หากมีเพียงวิธีการขึ้นบัญชีดำส่วนขยาย…
php -m
diagnose
และเนื่องจากฉันกำลังสร้างคอนเทนเนอร์นักเทียบท่าสำหรับทีมของฉันการปรับปรุงความเร็วที่เล็กที่สุดจะเป็นประโยชน์ต่อทุกคน
การสร้างนามแฝงจะเป็นการระงับcomposer
xdebug
ข้อความแสดงข้อผิดพลาดนั้น
เพียงเพิ่มบรรทัดนี้~/.bash_aliases
ในระบบของคุณและมันควรจะทำงานได้อย่างไม่มีที่ติ
alias composer="php -n /usr/local/bin/composer"
โหลดเชลล์ใหม่เพื่อสร้างนามแฝงใหม่composer
พร้อมใช้งาน
source ~/.bash_profile
การใช้งาน:
$ composer --version
หมายเหตุ:
คุณไม่จำเป็นต้องใช้พารามิเตอร์อื่นใด
ขึ้นอยู่กับระบบของคุณคุณอาจมี.bashrc
แทน.bash_profile
.
อัพเดท:
ดังที่ @AlexanderKachkaev กล่าวถึงในความคิดเห็นไม่มีค่าอะไรที่จะเพิ่ม memory_limit ดังต่อไปนี้เพื่อหลีกเลี่ยงการหยุดทำงานในบางสถานการณ์:
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
-n
ตัวเลือกปิดการใช้งานPhar
ส่วนขยายจึงอาจล้มเหลวในการเรียกใช้จากcomposer.phar
alias composer="php -d memory_limit=-1 -n /usr/local/bin/composer"
ฉันได้คำตอบที่ใช้งานได้ดีสำหรับ OSX และอาจปรับให้เข้ากับเวอร์ชัน PHP ที่โหลดส่วนขยายโดยใช้ไฟล์. ini แต่ละไฟล์ใน "เพิ่มเติม ini dir":
#!/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"
ฉันมักจะสร้างเชลล์สคริปต์ต่อโปรเจ็กต์เนื่องจากทุกโปรเจ็กต์มีเวอร์ชัน PHP อื่น มันอยู่ใน/bin/
ไดเรกทอรีติดกับcomposer.phar
และcomposer.json
และฉันเรียกว่ามันเป็น./bin/composer
ในไดเรกทอรีโครงการของฉัน
หน้าตาเป็นแบบนี้ (สำหรับ 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 "$@"
-d
ตัวเลือกปิดการใช้งานได้อย่างมีประสิทธิภาพ xdebug COMPOSER_DISABLE_XDEBUG_WARN=1
ส่วนหนึ่งปิดการใช้งานปัญหานักแต่งเพลงคำเตือน
แนะนำให้ปิดใช้งานส่วนขยาย xdebug (ดูการแก้ไขปัญหาของผู้เรียบเรียง ) แต่โดยส่วนตัวแล้วฉันชอบสคริปต์ที่ง่ายกว่า
การกำหนดเวลาบางอย่างบนเครื่องของฉัน: 2 รันด้วย xdebug และเปิดใช้งาน ini: 1m33
รันด้วย xdebug แต่ปิดใช้งานไม่ได้: 0m19
รันโดยไม่มี xdebug: 0m10
COMPOSER_DISABLE_XDEBUG_WARN=1
: หากคุณได้รับคำเตือนก็หมายความว่าการเขียนของคุณไม่ทำงาน การกำหนดxdebug.remote_autostart
ดูเหมือนจะไร้ประโยชน์หากปิดใช้งานการดีบักระยะไกล
xdebug.remote_autostart
คุณสิทธิเกี่ยวกับ เกี่ยวกับสคริปต์ประสิทธิภาพ: การตรวจสอบนักแต่งเพลงถ้าขยาย xdebug ถูกโหลดไม่ได้ถ้ามันจริงทำอะไรดูที่รหัสที่นี่ ตัวเลือก ini ทำงานได้ดีในสคริปต์ php "ปกติ" แต่อีกครั้ง: ฉันไม่ได้ทำการทดสอบประสิทธิภาพ ...
หากคุณใช้ PHPStorm รุ่นล่าสุด (2016.2) จะมาพร้อมกับคุณสมบัติในการเปิดใช้งาน XDebug สำหรับสคริปต์ CLI ตามต้องการซึ่งหมายความว่าคุณสามารถปิด XDebug ทั่วโลกบนเครื่องพัฒนาของคุณ IDE จะเปิดใช้งานได้ทันทีเมื่อจำเป็นต้องใช้รหัสภายในโครงการของคุณ
PhpStorm 2016.2 แนะนำโหมด Xdebug On Demand ที่คุณสามารถปิดใช้งาน Xdebug สำหรับการติดตั้ง PHP ทั่วโลกของคุณและ PhpStorm จะเปิดใช้งานเมื่อจำเป็นเท่านั้น - เมื่อคุณดีบักสคริปต์ของคุณหรือเมื่อคุณต้องการรายงานการครอบคลุมโค้ด
คุณต้องแก้ไขค่ากำหนด PHP Interpreters เพื่อรวมเส้นทางไปยัง XDebug ตามที่อธิบายไว้ในบทความที่เชื่อมโยง
สำหรับฉันแล้วสิ่งนี้ดูเหมือนจะเป็นทางออกที่สมบูรณ์แบบเพราะฉันมักจะต้องการ XDebug ในขณะที่ฉันอยู่ใน IDE
อย่างไรก็ตาม XDebug มีการใช้งานที่เป็นไปได้อื่น ๆ เมื่อคุณ "ออฟไลน์" เช่นการทิ้งสแต็กแบบขยายในบันทึกข้อผิดพลาดซึ่งคุณจะสูญเสียโดยการปิดใช้งานทั่วโลก แน่นอนว่าคุณไม่ควรเปิดใช้งาน XDebug ในการใช้งานจริงดังนั้นจึง จำกัด เฉพาะกรณีใช้งานเช่นการทดสอบเบต้าหรือสคริปต์ CLI การทดสอบอัตโนมัติในการพัฒนา
แทนที่จะสับสนกับการเปิดใช้งานหรือปิดใช้งานโมดูล PHP ชั่วคราวเมื่อคุณอาจมีกระบวนการทำงานพร้อมกันโดยใช้ PHP (เช่นเป็นส่วนหนึ่งของไปป์ไลน์ CI) คุณสามารถบอก PHP ให้ชี้ไปที่ไดเร็กทอรีการโหลดโมดูลอื่นได้
แม้ว่าสิ่งนี้จะคล้ายกับวิธีแก้ปัญหาบางอย่างที่กล่าวถึงข้างต้น แต่ก็สามารถแก้ปัญหาขอบบางกรณีได้ซึ่งมีประโยชน์มากเมื่อใช้โดย Jenkins หรือนักวิ่ง CI คนอื่น ๆ ซึ่งทำการทดสอบบนเครื่องเดียวกันพร้อมกัน
วิธีที่ง่ายที่สุดคือใช้ตัวแปรสภาพแวดล้อม PHP_INI_SCAN_DIR
การใช้สิ่งนี้ในสคริปต์หรืองานสร้างนั้นง่ายมาก:
export PHP_INI_SCAN_DIR=/etc/php.d.noxdebug
php composer install
แน่นอนว่าคุณต้องเตรียม /etc/php.d.noxdebug ก่อนโดยทำสิ่งที่ชอบ:
mkdir /etc/php.d.noxdebug
cp /etc/php.d/* /etc/php.d.noxdebug
rm /etc/php.d.noxdebug/xdebug.ini
ซึ่งหมายความว่าคุณมีสภาพแวดล้อมที่คล้ายกับสภาพแวดล้อม php เก่าโดยมีเพียงโมดูลเดียวที่ขาดหายไป หมายความว่าคุณไม่จำเป็นต้องกังวลว่าจะต้องโหลดโมดูล phar / json เหมือนที่คุณทำกับโซลูชัน php -n
ฉันคิดวิธีแก้ปัญหาสำหรับตัวติดตั้ง Composer บน Windows - มันควรจะใช้งานได้กับการติดตั้ง Composer โดยพื้นฐานแล้วจะสร้างสำเนาของไฟล์ INI ที่โหลดแล้วและแสดงความคิดเห็นเกี่ยวกับส่วนขยาย xdebug zend จากนั้นโหลดไฟล์การกำหนดค่านั้นเมื่อเรียกใช้งานตัวแต่ง .
ฉันได้เปิดปัญหาเพื่อดูว่าพวกเขาต้องการรวมการเปลี่ยนแปลงนี้หรือไม่:
https://github.com/composer/windows-setup/issues/58
คุณสามารถค้นหาคำแนะนำและรหัสของฉันได้ที่นั่น
ดังที่ระบุไว้ในคำตอบของ Joyceปัญหานี้ไม่มีใน Composer เวอร์ชันล่าสุดอีกต่อไป
เอกสารนักแต่งเพลงที่ได้รับการปรับปรุงเพื่อให้ทราบนี้ รายละเอียดวิธีเปิดใช้งาน xdebug ด้วย Composer (หากจำเป็น)
คุณสามารถปรับปรุงรุ่นของนักแต่งเพลงโดยใช้การอัปเดตตัวเอง
บน Mac ของฉันฉันต้องทำ: sudo php /opt/local/bin/composer self-update
รายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ในบริบทของการติดตั้ง Homebrew PHP สามารถพบได้ในปัญหานี้
นี่คือผลงานของฉันตามการติดตั้งHomebrew ที่ติดตั้ง PHP บน MacOS X
มันคือเสื้อคลุมเชลล์สคริปต์ที่ออกแบบมาเพื่อบันทึกเป็นไฟล์ปฏิบัติการที่/usr/local/bin/composer
โดยมีไบนารี Composer ที่/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
สคริปต์ Wrapper:
สคริปต์เชื่อมต่อกับการติดตั้ง OS X / Homebrew ของ PHP 5.5 ควรปรับเส้นทางให้ทำงานกับ PHP เวอร์ชันอื่นและระบบปฏิบัติการอื่น ๆ 'และรูปแบบไดเร็กทอรี' ผู้จัดการแพ็คเกจ ' โปรดทราบว่า sed บางเวอร์ชันไม่จำเป็นต้องมีอาร์กิวเมนต์สตริงว่างตาม-i
อ็อพชัน
สคริปต์ตรงไปตรงมาตรงที่มันทำงานโดยตรงกับไฟล์คอนฟิกูเรชัน PHP หลักอย่างไรก็ตามนี่ก็เป็นข้อเสียเช่นกัน: Xdebug จะถูกปิดใช้งานสำหรับสคริปต์ใด ๆ ที่เกิดขึ้นพร้อมกับสคริปต์นี้
ในสภาพแวดล้อมการพัฒนาของฉันนี่เป็นการแลกเปลี่ยนที่ยอมรับได้เนื่องจาก Composer ดำเนินการด้วยตนเองและเป็นครั้งคราวเท่านั้น อย่างไรก็ตามคุณอาจไม่ต้องการใช้เทคนิคนี้หากเรียกใช้ Composer โดยเป็นส่วนหนึ่งของกระบวนการปรับใช้อัตโนมัติ
ในกรณีส่วนใหญ่คุณไม่ต้องการ xdebug ในโหมด CLI หากสิ่งนี้เป็นที่ยอมรับสำหรับคุณคุณสามารถกำหนดค่า cli และ cgi ให้แตกต่างกันได้
ดังนั้นหากคุณสร้างphp-cli.iniและconf-cli.dใกล้ออกจากไฟล์ php.ini เกินกว่าที่คุณจะกำหนดค่า cli และ cgi ให้แตกต่างกันได้ (สำหรับ cgi จะเป็นphp.iniและconf.d ) อย่าใส่ xdebug.ini ลงใน conf-cli.d
หากคุณติดตั้งนักแต่งเพลงโดยใช้ brew บน OS X คุณสามารถใช้นามแฝงนี้:
alias composer="php -n $(cat $(which composer) | grep composer.phar | awk '{print $7}')"
วิธีแก้ปัญหาอย่างรวดเร็วของฉันสำหรับการติดตั้ง macports ด้วย PHP หลายเวอร์ชันคือการเขียน shell wrapper แบบธรรมดาสำหรับ 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
จากนั้นเรียกใช้คำสั่งของนักแต่งเพลงดังนี้:
sudo composer-nodebug.sh update
ข้อเสีย:
ไม่หรูหรา แต่เรียบง่าย
$1…$7
... อาจจะเป็น$@
หรืออะไรทำนองนั้นคุณจะต้องดู
การสร้างนามแฝงสำหรับผู้แต่งเพื่อปิดใช้งาน xdebug และป้องกันข้อผิดพลาดของหน่วยความจำ:
เพิ่มบรรทัดนี้ใน ~ / .bash_profile ของคุณ
alias composer='php -d xdebug.profiler_enable=0 -d memory_limit=-1 /usr/local/bin/composer'
รีสตาร์ทเทอร์มินัลเพื่อให้นามแฝงใหม่พร้อมใช้งาน
นี่คือวิธีแก้ปัญหาอย่างรวดเร็วของฉันในการกำจัดคำเตือน Xdebug ในเวอร์ชัน PHP5-cli ฉันได้ลบการรองรับ Xdebug สำหรับ PHP5-cli บน Ubuntu 14.04 แล้ว
ซีดี /etc/php5/cli/conf.d/
sudo rm 20-xdebug.ini
ตอนนี้ไม่มีคำเตือน Xdebug บน PHP5-cli อีกต่อไป
sudo phpdismod xdebug
จะเป็นวิธีที่ต้องการในการเดรัจฉานrm