إيماج ماجيك:فشل تحويل png عبر PHP ويعمل عبر bash shell

StackOverflow https://stackoverflow.com/questions/1019768

  •  06-07-2019
  •  | 
  •  

سؤال

عندي مشكلة غريبة جداً ولم أجد لها حلاً بعد. تحديث انظر الحل أدناه

ما أحاول القيام به هو تحويل الصورة بالحجم الكامل إلى صورة مصغرة بحجم 160 × 120.إنه يعمل بشكل رائع مع ملفات jpg وjpeg بأي حجم، ولكن ليس مع png.

أمر إيماج ماجيك:

/opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'

دالة PHP (مختصرة)

...
$cmd = "/opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'";
exec($cmd, $output, $retval);
$errors += $retval;
if ($errors > 0) {
    die(print_r($output));
}

عندما تقوم هذه الوظيفة بتشغيل $retval يساوي 1 مما يعني فشل أمر التحويل (لم يتم إنشاء الصورة المصغرة).

هذا هو المكان الذي يصبح فيه الأمر مثيرًا للاهتمام، إذا قمت بتشغيل نفس الأمر بالضبط في الصدفة الخاصة بي، فسيعمل.

wedbook:~ wedix$ /opt/local/bin/convert '/WEBSERVER/images/img_0003-192-10.png' -thumbnail x320 -resize '320x<' -resize 50% -gravity center -crop 160x120+0+0 +repage -quality 91 '/WEBSERVER/thumbs/small_img_0003-192-10.png'
wedbook:~ wedix$ 

لقد حاولت استخدام وظيفة PHP مختلفة مثل النظام والتمرير لكنها لم تنجح.اعتقدت ربما شخص ما هنا يعرف الحل.

أنا استخدم

  1. MAMP 1.7.2
    • Apache/2.0.59
    • PHP/5.2.6

شكرًا!

تحديث

لقد قمت بتحديث التبعيات التالية

  1. libpng from 1.2.35 to 1.2.37
  2. libiconv from 1.12_2 to 1.13_0
  3. ImageMagick 6.5.2-4_1 to 6.5.2-9_0

ومع ذلك، فإنه لم يحل مشكلتي.

التحديث الثاني

لقد وجدت أخيرًا شيئًا قد يساعد، عندما يتم تشغيل الوظيفة، هذا ما تتم طباعته في سجلات Apache:

dyld: Library not loaded: /opt/local/lib/libiconv.2.dylib
  Referenced from: /opt/local/bin/convert
  Reason: Incompatible library version: convert requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0

التحديث الثالث

libiconv.2.dylib هو الإصدار 8.0.0...

bash-3.2$ otool -L /opt/local/lib/libiconv.2.dylib 
/opt/local/lib/libiconv.2.dylib:
    /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)

التحديث الرابع

كانت المشكلة متعلقة بـ MAMP، راجع الحل أدناه

هل كانت مفيدة؟

المحلول

حلها!

اتضح متغير البيئة DYLD_LIBRARY_PATH لم يتم ضبطه بشكل صحيح.

يأتي نظام التشغيل Mac OS X Leopard مزودًا بـ libiconv 7.0.0 لكن التحويل يتطلب 8.0.0 (راجع التحديث الثاني أعلاه)

bash-3.2$ otool -L /usr/lib/libiconv.2.dylib 
/usr/lib/libiconv.2.dylib:
    /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.1)

تم تثبيت ImageMagick وجميع التبعيات باستخدام MacPorts ضمن /opt/local.يتطلب هذا إضافة المسار /opt/local/lib يدويًا إلى DYLD_LIBRARY_PATH.

إذا قمت بإضافة المسار /opt/local/lib ل DYLD_LIBRARY_PATH في نظام التشغيل Mac OS X ليوبارد apachectl envvars ملف /usr/sbin/envvars لا يعمل.لماذا؟هذا لأنني لا أستخدم Apache من نظام التشغيل Mac OS X Leopard، بل أستخدم MAMP.

مامب لديها خاصة بها apachectl النصي وانها الخاصة envvars ملف.

أضفت المسار /opt/local/lib ل DYLD_LIBRARY_PATH في مامب apachectl envvars ملف /Applications/MAMP/Library/bin/envvars

DYLD_LIBRARY_PATH="/opt/local/lib:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

يتم الآن إنشاء صور PNG المصغرة الخاصة بي ولم يتم إنشاء أي أخطاء في سجل أخطاء Apache!

آمل أن يساعد هذا شخصًا ما وفي المرة القادمة سأتذكر التحقق من كل ملفات السجلات قبل طلب المساعدة!

فيل

نصائح أخرى

كان المسار الخاص بي هو /opt/local/bin، ولكن حتى إضافة ذلك إلى DYLD_LIBRARY_PATH لم ينجح.أخيرًا، عندما قمت بتغيير المسار العادي فقط، كان يعمل عبر PHP.

؛لم تعمل...

;DYLD_LIBRARY_PATH="/opt/local/bin:/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"

؛ تصدير DYLD_LIBRARY_PATH

;هذا يعمل!

مسار التصدير = "$PATH:/opt/local/bin"

تأكد من أن المستخدم الذي يقوم بتشغيل كود php لديه نفس الأذونات على الملفات والأدلة.

يجب أن تكون هذه الأمور واضحة، ولكن تأكد من التحقق من أشياء مثل الوضع الآمن لـ PHP، وopen_basedir، وما إذا كان exec تم تعطيله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top