2012-03-28 33 views
8

Tôi đã đoạn mã sauPHP proc_open vấn đề trên cửa sổ

$env=array('PATH'=>'C:\Program Files\MySQL\MySQL Server 5.1\bin', 
      'PATHEXT' => '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC'); 
$cmd='mysql "--port=3306" "--host=127.0.0.1" "--user=root" "--password=xxxx" <"C:\Projects/script.sql" 2>&1'; 
print $cmd; 
$proc = proc_open($cmd, $descriptorspec, $pipes, NULL, $env) or die("Cannot run $cmd"); 

while ($line=fgets($pipes[1])) print $line; 

print "\n\nCompleted\n"; 

Và kết quả tôi nhận được là

ERROR 2004 (HY000): Can't create TCP/IP socket (10106) 

Tại sao các tùy chọn cổng bị bỏ qua? Lệnh hoạt động hoàn toàn tốt trên dòng lệnh.

+2

nó có hoạt động từ dòng cmd không? Nó có thể là một vấn đề cho phép. (được nói, tại sao không sử dụng phần mở rộng mysql? :) – Pierre

+0

Hmmm ... thư viện kết nối MySQL trong PHP? Thú vị ... – Xeoncross

+0

bạn đã thử bao gồm thư mục windows trong đường dẫn env var chưa? – Michal

Trả lời

3

Lỗi thấy

ERROR 2004 (HY000): Can't create TCP/IP socket (10106) 

được nâng lên bởi mysql, vì vậy quá trình mysql thực sự bắt đầu.

Lỗi này tương ứng với CR_IPSOCK_ERROR và lỗi in nguyên nhân gốc của vấn đề: 10106.

Một tìm kiếm nhanh chóng cung cấp cho:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx

và đặc biệt:

WSAEPROVIDERFAILEDINIT 
10106 

Service provider failed to initialize. 
The requested service provider could not be loaded or initialized. This error is returned if either a service provider's DLL could not be loaded (LoadLibrary failed) or the provider's WSPStartup or NSPStartup function failed. 

Tôi không nghĩ rằng đây có bất cứ điều gì để làm với số cổng được "bỏ qua", và thậm chí ít sự cố tường lửa hơn.

Dường như môi trường được tạo bởi proc_open đủ tốt để bắt đầu quá trình mysql, nhưng chưa đủ đầy đủ để gọi tới LoadLibrary từ trong quá trình đó, để tải mã mạng cụ thể là không thành công.

Lệnh tương tự hoạt động từ dòng lệnh, rất có thể do môi trường trong dòng lệnh chứa nhiều hơn nữa.

0

thử tắt tường lửa của bạn hoặc kích hoạt cổng

+0

Tôi đã thử rằng –

+0

nếu bạn telnet cổng đó, nội dung đó là gì? hoặc, bạn không thể đến được cảng? – danielpopa

+0

Hiện tại trên cổng đó –

1

Đối số $ env để proc_open thay thế môi trường hiện tại, nhưng nếu nó là NULL, môi trường của quy trình hiện tại được sử dụng.

Một giải pháp có thể là sử dụng putenv() để thay đổi môi trường hiện tại thay vì chỉ định một mảng mới cho $ env. Hãy để công việc thừa kế môi trường.

Tôi gặp sự cố này đặc biệt khi sử dụng thành phần giao hưởng/quá trình để khởi chạy quy trình PHP. Mọi thứ hoạt động tốt trong Linux, nhưng quá trình này không thành công trong các máy chủ Windows không có quyền truy cập mạng. Sử dụng putenv() và NULL cho $ env làm việc tốt trong cả hai trường hợp hệ điều hành, và giải quyết vấn đề. Hiệu ứng của putenv() chỉ kéo dài trong thời gian yêu cầu phát hành nó, vì vậy nó sẽ an toàn trừ khi thay đổi của bạn gây ra vấn đề với phần còn lại của kịch bản của bạn, hoặc có những thứ trong môi trường hiện tại của bạn. trong quá trình mở.

Tôi googled cách của tôi ở đây tìm kiếm câu trả lời và thông tin chắc chắn đã giúp tôi giải pháp. Nó có thể đã quá lâu để giúp các poster ban đầu, nhưng có lẽ nó có thể giúp người tiếp theo.

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