2011-08-23 20 views
15

Tôi đã cài đặt Imagemagick bằng Homebrew trên Lion, mọi thứ đều ổn, ngoại trừ việc nó không hoạt động khi được gọi từ php. Console:Đã giải quyết: MAMP Php không thể thực hiện ('chuyển đổi') sau khi Homebrew ImageMagick cài đặt

$ convert -version 
Version: ImageMagick 6.7.1-1 2011-07-29 Q16 http://www.imagemagick.org 
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC 
Features: OpenMP 

$ which convert 
/usr/local/bin/convert 

PHP:

echo exec ('convert -version'); 

hoặc exec ('chuyển đổi -version', $ đầu ra); var_dump ($ output);

Không tạo ra gì (hoặc mảng trống).

exec ('/usr/local/bin/convert') // works, but 
exec ('which convert') // doesn't 

Tôi cần thử nghiệm tại địa phương này để đảm bảo tôi có thể phát hiện chuyển đổi trong môi trường sản xuất. Nhưng tôi không thể kiểm tra nó đúng cách. PATH được thiết lập và nó hoạt động trong Terminal, nhưng không phải từ PHP.

giải quyết:

Hóa ra, cho php để làm việc convert phải ở trong /usr/bin/ vì vậy đây giải quyết nó:

ln -s /usr/local/bin/convert /usr/bin/convert 

Cập nhật

Đó là becasue của MAMP, đây là bản sửa lỗi: http://firedevcom.tumblr.com/post/22791937644/fix-for-homebrew-imagemagick-and-mamp

mở/Applications/MAMP/Library/bin/envvars

Và nhận xét ra các dòng sau:

DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH" 
export DYLD_LIBRARY_PATH 

Xong.

+1

Chuyển đổi trong đường dẫn của PHP? Bạn có thể phải chỉ định một '/ absolute/path/to/convert' trong lệnh exec(). Hãy nhớ rằng môi trường trong một cuộc gọi hàm exec() PHP có thể khác biệt đáng kể so với những gì bạn nhận được ở dấu nhắc trình bao. –

+0

Hmm điều là - tất cả mọi thứ hoạt động trên máy chủ sản xuất, chỉ cần không phải với Homebrew. Tôi nghĩ PATH nên được thừa hưởng vào hộp cát exec, không? – firedev

+1

Môi trường shell của php hoàn toàn khác với môi trường shell của người dùng. bạn không thể so sánh chúng trực tiếp. hãy thử thực hiện 'exec ('echo $ PATH');' để xem những gì mà shell đã đi. PHP sẽ kế thừa môi trường Apache. –

Trả lời

6

Thêm câu trả lời của riêng tôi ở đây để bạn có thể bỏ phiếu:

Nó được gây ra bởi MAMP, đây là việc sửa chữa: http://firedevcom.tumblr.com/post/22791937644/fix-for-homebrew-imagemagick-and-mamp

mở /Applications/MAMP/Library/bin/envvars

Và nhận xét ra các dòng sau:

DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH" 
export DYLD_LIBRARY_PATH 

Xong.

+0

cảm ơn, nó hoạt động !!!! – keithics

+0

Cũng hoạt động cho XAMPP, đường dẫn:/Applications/XAMPP/xamppfiles/bin/envvars –

1

Xác minh rằng chuyển đổi trong là biến môi trường PATH của máy chủ. Hoặc chỉ cần chỉ định đường dẫn đầy đủ:

exec('/usr/local/bin/convert -version'); 
+0

Đó là trong PATH trong giao diện điều khiển, nhưng không phải trong exec php, tuy nhiên trên máy chủ sản xuất mọi thứ dường như làm việc tốt. Và tôi cần có khả năng phát hiện hình ảnh động tự động. Nó hoạt động trên Linux, nhưng không phải với homebrew. – firedev

1

Các exec trả về dòng cuối cùng từ kết quả của lệnh đó sẽ xảy ra là một chuỗi rỗng. Nếu bạn muốn nhận được đầu ra, chỉ cần làm một cái gì đó như thế này:

exec('convert -version', $output); 
var_dump($output); // it is an array which filled with every line of output from the command 
+1

Sử dụng 'exec ('convert -version 2> & 1', $ output);' nếu bạn cũng muốn các lỗi trong '$ output'. – arnaud576875

+0

Tất nhiên tôi đã sử dụng var_dump quá, nó chỉ không trả lại bất cứ điều gì – firedev

+1

Vì vậy, những gì về việc sử dụng đường dẫn đầy đủ của chuyển đổi? – xdazz

2
sudo ln -s /usr/local/bin/convert /usr/bin/convert 
+0

Bạn đã lưu tôi! Bây giờ tôi có thể sử dụng lệnh exec mà không bao gồm đường dẫn tuyệt đối. –

1

Đơn giản chỉ cần sử dụng exec("PATH=\$PATH:/usr/local/bin; convert file.pdf file.png"); Nó sẽ thêm convert để PATH trên runtime.

+0

đây chính xác là những gì tôi cần. Nhưng ở đây tôi cần phải có được một thủ thuật trên mã PHP của tôi bởi vì tôi không cần PATH đến máy trực tiếp của tôi. Bạn có biết cách đặt trên mac đường dẫn xuất này toàn cầu không? – workdreamer

1

thay vì chỉ thực hiện ("chuyển đổi ...."); sử dụng đường dẫn đầy đủ.bạn có thể lấy nó bằng cách gõ các thiết bị đầu cuối

loại chuyển đổi

bạn sẽ nhận được một cái gì đó như: chuyển đổi sẽ được băm (/ opt/local/bin/chuyển đổi)

vì vậy bây giờ sử dụng:

exec ("/ opt/local/bin/convert ....");

[tín dụng cho @Nikki]

sau khi bình luận rằng ra

DYLD_LIBRARY_PATH = "/ Applications/MAMP/Library/lib: $ DYLD_LIBRARY_PATH" xuất khẩu DYLD_LIBRARY_PATH

trong/Applications/MAMP/Library/bin/envvars

+1

Bạn sẽ nhanh chóng biết rằng đây là thói quen xấu khi dự án của bạn đạt đến giai đoạn sản xuất. – firedev