2012-04-10 25 views
6

Tôi đang cố biên dịch phần mở rộng imagemagick (imagick) để sử dụng trong môi trường không an toàn trên cửa sổ.Biên dịch một phần mở rộng của PHP là không an toàn theo chủ đề

Tôi đang sử dụng PHP 5.3.10 và đã thiết lập Visual C++ express làm môi trường biên dịch của tôi. Vấn đề là tôi đang sử dụng một phiên bản PHP không an toàn với tư cách là một mô-đun FCGI trong Apache 2.2.

Do đó, PHP của tôi được cung cấp với php5.lib và không phải là php5ts.lib. Tôi tin rằng đây là lý do tại sao tôi nhận được các lỗi này:

imagick.obj : error LNK2019: unresolved external symbol __imp__tsrm_mutex_alloc referenced in function _zm_startup_imagick 

Tôi chỉ xây dựng và biên dịch mọi thứ trên linux, vì vậy không chắc chắn cách thực hiện điều này trên môi trường cửa sổ.

Tôi làm cách nào để biên dịch tiện ích để tiện ích không an toàn?


Tôi đã tải xuống bản nhị phân luồng của PHP 5.3.10 để nhận bản sao của php5ts.lib. Sau đó tôi có thể biên dịch phần mở rộng.

Tôi đoán rằng việc đặt chỉ thị tiền xử lý ZTS thành 1 hoặc 0 sẽ làm cho tiện ích mở rộng biên dịch thành luồng an toàn hoặc không an toàn. (Không quá chắc chắn về điều này, vì vậy nếu ai đó có thể cho tôi biết nếu điều này là chính xác hay không, nó sẽ được nhiều đánh giá cao. :))

Sau đó tôi thiết lập một máy ảo chạy Windows 7 và cài đặt phiên bản mới nhất của WAMP. Lý do là nó đã sử dụng một phiên bản an toàn của PHP.

Tôi đã đặt dll trong thư mục ext trong cài đặt PHP và bật nó trong php.ini. Tuy nhiên, ngay sau khi thử cả hai phiên bản ts và nts trong WAMP, tôi sẽ nhận được:

PHP Warning: PHP Startup: Unable to load dynamic library 'c:/wamp/bin/php/php5.3.10/ext/imagick.dll' - The specified module could not be found. 
in Unknown on line 0 

Nhưng vấn đề là rằng c:/wamp/bin/php/php5.3.10/ext/imagick.dll' không tồn tại, và có tôi đã kiểm tra này rất nhiều lần.

Sau đó tôi hạ cấp ImageMagick xuống 6.6.2-10-Q16 nhưng vẫn thấy cùng một vấn đề.

Sự cố tương tự xảy ra trên máy dev của tôi đang chạy phiên bản nts của PHP 5.3.10 trên Apache 2.2 (tất cả được cài đặt theo cách thủ công).


Có vẻ như tôi có thể sai về bộ xử lý trước ZTS. Nếu tôi đặt ZTS=0 và biên dịch, hãy sử dụng bộ phụ thuộc tập đi trên dll được biên dịch vẫn cho thấy rằng nó yêu cầu php5ts.dll chỉ xuất hiện trên các phiên bản an toàn của PHP.


Tôi đã làm việc nhiều hơn với người phụ thuộc tập đi và thấy rằng tôi phải liên kết thống kê với msvc100d.dll. Sau đó tôi đã xóa ZTS trong định nghĩa tiền xử lý và có thể biên dịch bằng cách sử dụng php5.lib thay vì php5ts.dll. Tôi nghĩ rằng điều này sẽ cho tôi một dll phi ts.

Tuy nhiên, khi tải các phần mở rộng, tôi vẫn nhận được:

PHP Warning: PHP Startup: Invalid library (maybe not a PHP library) 'imagick.dll' in Unknown on line 0 

Và lỗi từ sự phụ thuộc walker:

Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module. 
Error: Modules with different CPU types were found. 
Warning: At least one delay-load dependency module was not found. 
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. 

cài đặt Visual C++ hiện năm 2008 và biên soạn sử dụng nền tảng bộ công cụ V90 , nhưng vẫn phải đối mặt với cùng một vấn đề.

Bất cứ lời khuyên đánh giá cao :)


Solution Tìm thấy! Xem câu trả lời của tôi.

+0

câu hỏi serverfault.com. – Raptor

Trả lời

5

Got it! Tôi hy vọng điều này có thể giúp những người biên dịch các phần mở rộng php trên các cửa sổ trong tương lai. Những gì tôi đã làm được dựa trên: https://wiki.php.net/internals/windows/stepbystepbuild

Lưu ý: Tôi đọc câu trả lời trên trang web này cho biết biên dịch các phần mở rộng PHP của chính nó trên các cửa sổ không được hỗ trợ. Dựa trên các thí nghiệm của tôi ngày hôm qua, nó có vẻ là rất nhiều công việc, vì vậy tôi đang sử dụng quá trình xây dựng PHP.

Cách tốt nhất là sử dụng quy trình tạo PHP.

  1. Cài đặt Visual C++ Express 2008 (bất kỳ phiên bản sẽ làm, nhưng thể hiện là miễn phí) và Windows SDK 6.1 (lưu ý rằng chúng tôi muốn phiên bản 6.1 không bất cứ điều gì cũ hoặc mới hơn).

  2. Cài đặt SVN client tools nếu bạn chưa làm như vậy và khởi động lại biến số PATH có hiệu lực.

  3. Lấy PHP SDK binary tools và giải nén nó thành C:\php-sdk.

  4. Bắt đầu CMD Shell trong Microsoft Windows SDK v6.1 trong trình đơn bắt đầu của bạn và chạy cd C:\php-sdk.

  5. Chạy setenv /x86 /xp /release điều này tạo bản phát hành 32 bit. Bạn có thể sử dụng /x64 để tạo bản phát hành 64 bit (tôi chưa thử bản này).

  6. chạy bin\phpsdk_setvars.bat

  7. chạy bin\phpsdk_buildtree.bat php53dev

  8. Tải PHP source code và giải nén nó vào C:\php-sdk\php53dev\vc9\x86 để bạn kết thúc với C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

  9. Tải mới nhất deps và trích xuất tất cả mọi thứ để C:\php-sdk\php53dev\vc9\x86. Bạn có thể được nhắc ghi đè lên bất kỳ thư mục hiện có nào, vì vậy nhấn yes.

  10. chạy cd C:\php-sdk\php53dev\vc9\x86

  11. Kiểm tra phiên bản mới nhất của phần mở rộng của bạn từ kho svn: svn co http://svn.php.net/repository/pecl/imagick/trunk pecl/imagick tôi đang kiểm tra ra imagick đây.

  12. Cài đặt bất kỳ phụ thuộc nào. Trong trường hợp của tôi, tôi cần cài đặt ImageMagick, vì vậy tôi đã tải xuống phiên bản mới nhất được đề xuất windows binary. Bạn sẽ cần phải khởi động lại sau khi cài đặt để cập nhật biến số PATH của mình, nhưng bạn có thể thực hiện việc này sau khi đã biên soạn. Hãy chắc chắn rằng bạn cài đặt các tiêu đề C/C++ và bao gồm là tốt.

  13. Sao chép nội dung của thư mục includes từ thư mục cài đặt ImageMagick sang C:\php-sdk\php53dev\vc9\x86\deps\include.

  14. Sao chép nội dung của thư mục lib từ ImageMagick cài đặt thư mục để C:\php-sdk\php53dev\vc9\x86\deps\lib

  15. Bây giờ, chúng ta hãy xây dựng: chạy cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz sau đó buildconf sau đó configure --help. Nhìn vào sự giúp đỡ đúng cách. Nó sẽ cho bạn thấy tất cả các cờ cấu hình và bất kỳ phần mở rộng sẵn có để kích hoạt. Trong trường hợp của tôi, vì tôi thêm imagick, tôi đã có một tùy chọn gọi --with-imagick

  16. Run config: configure --enable-cli --with-imagick=shared --disable-zts Nếu bạn muốn xây dựng một tổ chức phi-thread-safe sử dụng nhị phân --disable-zts, nếu không loại bỏ cờ cấu hình. Tôi không chắc chắn lý do tại sao, nhưng đôi khi tiện ích mở rộng sử dụng cờ --with-myextension và đôi khi là --enable-myextension, vì vậy hãy kiểm tra configure --help để cờ sử dụng. Nếu bạn thêm =shared sau cờ mở rộng, nó sẽ được biên dịch dưới dạng một tệp DLL riêng biệt, mà nó sẽ là thứ mà chúng tôi muốn.

  17. Biên dịch: chạy nmake rồi nmake snap.

  18. Xong :) Kiểm tra C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release (không an toàn chủ đề) hoặc C:\php-sdk\php53dev\vc9\x86\php-5.3.10\Release_TS (chỉ an toàn). Các tệp nhị phân đã biên soạn của bạn nên ở trong đó. Các phần mở rộng được biên dịch (pecl), phải ở trong một tệp ZIP tương tự như pecl-5.3.10-nts-Win32-VC9-x86.zip. Mở tệp này và giải nén tệp extensio DLL vào thư mục ext trong bản cài đặt PHP của bạn.

  19. Bật tiện ích mở rộng PHP và khởi động lại máy chủ web của bạn. Chạy phpinfo() và kiểm tra xem tiện ích đã được bật chưa.

  20. Nếu tiện ích mở rộng không hoạt động bình thường, hãy đảm bảo bạn khởi động lại để cập nhật biến số PATH của mình. Trong trường hợp của tôi, tôi cần phải có thư mục cài đặt imagemagick trong biến số PATH của tôi.

  21. ???

  22. Lợi nhuận!

+0

Tôi muốn cảm ơn bạn đã dành thời gian viết đoạn hướng dẫn tuyệt đẹp này. Thực sự hữu ích! –

0

Có lý do nào bạn cần phải biên dịch không? Tại sao không tải xuống? Nó thường đơn giản hơn/nhanh hơn trên Windows.

VC6: http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

VC9: http://valokuva.org/builds/

+0

Tôi đã thử các bản dựng từ Valokuva.org, nhưng chúng không hoạt động trên máy chủ hoặc WAMP được cài đặt thủ công của tôi. Các tệp nhị phân từ sk89q.com cũng không hoạt động. Đó là lý do tại sao tôi muốn biên dịch 3.1.0b1 so với phiên bản mới nhất của imagemagick. – F21

+0

Tôi có nghĩa là 3.1.0rc1 không phải 3.1.0b1. – F21

Các vấn đề liên quan