2009-06-16 26 views
6

Sau khi đấu vật với nguồn PHP trong nửa giờ, tôi đã từ bỏ. : P Câu hỏi đặt ra là: gọi hàm PHP flock() nào trên hệ thống Gentoo Linux? Tôi đang gặp một số vấn đề với nó (như khối-cho-30-giây-trong-mỗi-một-of-20-loop-iterations loại vấn đề) và tôi muốn biết tại sao lại như vậy.PHP đàn() - những gì dưới mui xe?

Trả lời

0

Trừ khi tôi hiểu nhầm bạn đang hỏi gì, PHP flock() là cuộc gọi đến chức năng hệ thống Unix flock() trên Gentoo. Họ có ngữ nghĩa giống hệt nhau.

+0

Semantics - vâng. Nhưng nó có thực sự gọi đàn chiên()? –

+0

Tôi không thể chứng minh điều này vì hiện tại tôi không chạy bản sao của PHP, nhưng tôi tin như vậy, vâng. Tại sao không thử nó ra cho mình với strace? –

+1

Tôi chỉ có quyền truy cập FTP vào máy chủ. –

0

Bạn đang sử dụng nó trên một ổ đĩa được kết nối hoặc nối mạng? Tôi sẽ không ngạc nhiên nếu những gì bạn đang gặp phải là deadlock và một số trong số comments in the documentation nói về điều đó.

The documentation for flock.

+0

Đọc kỹ - Gentoo Linux tại đây. Nhưng thiết lập đầy đủ là một chút phức tạp vì vậy tôi chỉ muốn biết những gì nó gọi bên dưới, để tôi có thể đặt hình ảnh đầy đủ với nhau bản thân mình. –

+0

Và không, nó không phải là bế tắc, mà tôi chắc chắn. Nhưng có những điều khác tôi nghi ngờ. –

+1

Ahh, tôi chỉ phát hiện ra rằng tập tin nằm trên một NFS gắn kết. Và hộp máy chủ cũng đang cố gắng đổ() nó (tải máy chủ web cân bằng, bạn thấy). –

3

// example: $stream = fopen(FILE, 'rb') or die('???'); 
$md = stream_get_meta_data($stream); 
echo $md['wrapper_type'];
flock($stream);
nếu điều này in plainfile thì lệnh gọi hàm băm php() được xử lý bởi php_stdiop_set_option (...) gọi flock(). Tùy thuộc vào việc PHP được biên dịch với HAVE_FLOCK hay không, đây có thể là hệ thống gọi flock() hoặc một hàm được định nghĩa trong flock_compat.c, sử dụng fcntl(). Trên hệ thống gentoo của tôi PHP đã được biên dịch với HAVE_FLOCK.

chính/suối/plain_wrapper.c @ tĩnh int php_stdiop_set_option (...):

  case PHP_STREAM_OPTION_LOCKING: 
      if (fd == -1) { 
       return -1; 
      } 

      if ((zend_uintptr_t) ptrparam == PHP_STREAM_LOCK_SUPPORTED) { 
       return 0; 
      } 

      if (!flock(fd, value)) { 
       data->lock_flag = value; 
       return 0; 
      } else { 
       return -1; 
      } 
      break;
Các vấn đề liên quan