banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Gọi một chương trình thực thi trong PHP?  XML
  [Question]   Gọi một chương trình thực thi trong PHP? 22/04/2011 14:33:44 (+0700) | #1 | 235994
Phineas
Member

[Minus]    0    [Plus]
Joined: 24/10/2010 21:31:24
Messages: 8
Offline
[Profile] [PM]
Hiện nay mình đang dùng Ubuntu 10.10, webserver apache, có viết một trang PHP và cần gọi một chương trình thực thi (viết bằng C) qua trang PHP đó, cả 2 chương trình này cùng nằm trên 1 máy.
Chương trình cần gọi (A) có sử dụng một vòng lặp vô hạn của thư viện glib. Hơn nữa, mình cần trao đổi dữ liệu qua lại giữa chương trình cần gọi và PHP, cũng như giữa webserver và webclient theo realtime. Mình đã nghĩ tới 2 cách:
1. Gọi A thông qua webserver theo CGI (có dùng ajax)
2. Gọi A thông qua PHP và cho chạy background.

Lý do dùng ajax trong cách 1 hay chạy background trong cách 2 là do A có vòng lặp vô hạn, nếu gọi theo cách thông thường thì ở bên client, trang web sẽ bị treo.

Trong cả 2 cách để đảm bảo tính real-time, mình cho 2 chương trình trao đổi dữ liệu với nhau qua tập tin, rồi dùng PHP xử lý nội dung tập tin trả về cho client. Mình có một số thắc mắc, mong được các bác giải đáp:
1. Còn có cách nào hỗ trợ trao đổi thông tin real time cho 2 chương trình kiểu như trên để đạt performance cao hơn không? Nếu có, xin các bác chỉ giúp.
2. Có cách nào để duy trì luồng dữ liệu realtime giữa webserver và webclient không (ngoài cách cho webclient thực hiện request liên tục sau một khoảng thời gian nhất định)? Mong được các bác chỉ dùm.

Cám ơn rất nhiều.
[Up] [Print Copy]
  [Question]   Gọi một chương trình thực thi trong PHP? 22/04/2011 15:35:54 (+0700) | #2 | 235996
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]

Phineas wrote:
Hiện nay mình đang dùng Ubuntu 10.10, webserver apache, có viết một trang PHP và cần gọi một chương trình thực thi (viết bằng C) qua trang PHP đó, cả 2 chương trình này cùng nằm trên 1 máy.
Chương trình cần gọi (A) có sử dụng một vòng lặp vô hạn của thư viện glib. Hơn nữa, mình cần trao đổi dữ liệu qua lại giữa chương trình cần gọi và PHP, cũng như giữa webserver và webclient theo realtime. Mình đã nghĩ tới 2 cách:
1. Gọi A thông qua webserver theo CGI (có dùng ajax)
2. Gọi A thông qua PHP và cho chạy background.

Lý do dùng ajax trong cách 1 hay chạy background trong cách 2 là do A có vòng lặp vô hạn, nếu gọi theo cách thông thường thì ở bên client, trang web sẽ bị treo.

Trong cả 2 cách để đảm bảo tính real-time, mình cho 2 chương trình trao đổi dữ liệu với nhau qua tập tin, rồi dùng PHP xử lý nội dung tập tin trả về cho client. Mình có một số thắc mắc, mong được các bác giải đáp:
1. Còn có cách nào hỗ trợ trao đổi thông tin real time cho 2 chương trình kiểu như trên để đạt performance cao hơn không? Nếu có, xin các bác chỉ giúp.
2. Có cách nào để duy trì luồng dữ liệu realtime giữa webserver và webclient không (ngoài cách cho webclient thực hiện request liên tục sau một khoảng thời gian nhất định)? Mong được các bác chỉ dùm.

Cám ơn rất nhiều. 


Chương trình C của bồ cứ việc chạy vô hạn, xuất dữ liệu "real-time" ra một tệp XML hay cho vào thẳng một hệ quản trị cơ sở dữ liệu ( DBMS ).

PHP sẽ làm nhiệm vụ lấy dữ liệu từ trong file ( hoặc DB ) trả về cho Web Client Interface dùng ajax bất kỳ khi nào web client interface gửi request cập nhật dữ liệu

Còn web client interface dùng ajax làm sao để cập nhật "tương đối" real-time ( tức dữ liệu trên sẽ unreal-time trong một khoảng thời gian rất nhỏ giữa 2 lần cập nhật ) thì dễ thôi, javascript dùng setTimeout() để gọi lại hàm update() dữ liệu sau một khoảng thời gian tính bằng miliseconds . Chẳng có trường hợp treo nào hết nếu set cho XMLHTTPObject là "Bất đồng bộ" , lí do là vì trong chế độ bất đồng bộ, các mã javascript tiếp tục chạy cho đến khi có dữ liệu trả về

Bồ đã muốn dùng AJAX thì phải làm mọi thứ bằng tay, và hiểu kĩ về cơ chế hoạt động của XMLHTTPObject() , chớ đừng chỉ dùng các Framework một cách tiện lợi mà làm hỏng đi tư duy lập trình

Còn các giải pháp real-time khác ( ko dùng Web Interface ) cần khả năng PUSH dữ liệu từ server về client, mà điều này thì cần một RAW socket connection, thứ này các ngôn ngữ lập trình script khó có thể cung cấp
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   Gọi một chương trình thực thi trong PHP? 22/04/2011 16:14:25 (+0700) | #3 | 236000
Phineas
Member

[Minus]    0    [Plus]
Joined: 24/10/2010 21:31:24
Messages: 8
Offline
[Profile] [PM]
Cám ơn bạn đã trả lời,

Thực ra do yêu câu của khách hàng, trang web mình viết có chức năng tương tự như meebo.com hay imo.im.
Hiện nay mình đang làm y chang như cách bạn nói, bên client dùng XMLHTTPObject bằng tay để cập nhận dữ liệu. Khổ nỗi, kiểu PULL này ngốn tài nguyên cả client lẫn server nhiều quá, do cứ định kỳ client lại request về server (y chang DoS), nên mình phải cần thêm khả năng PUSH từ phía server. <b>Không biết có thể giải quyết vấn đề này trong phạm vi web app php thông thường không nhỉ? Hay chỉnh lại config của Apache cũng được</b>

Cái RAW socket bạn nói là một dạng embedded webserver, mình mới google ra
www.koanlogic.com/klone/ cho phép nhúng C vào trong mã HTML (hay nhúng mã HTML vào C, :-D). Cái này có vẻ mới nên không chắc là có ổn định không nữa. Bạn nào xài rồi thì đánh giá dùm mình với.

Xài embedded server chỉ là cách cuối cùng, khi không còn cách nào khác để PUSH dữ liệu từ server một cách hiệu quả trong phạm vi <b>Apache - PHP/HTML - webclient</b> (1)

Bạn nào biết cách giải quyết vấn đề PUSH từ server này theo mô hình (1) trên thì chỉ cho mình với.

Cám ơn rất nhiều.
[Up] [Print Copy]
  [Question]   Gọi một chương trình thực thi trong PHP? 22/04/2011 18:12:29 (+0700) | #4 | 236003
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
Do bồ ko chịu nói rõ nhu cầu gốc gác của vấn đề nên giải pháp sao đưa ra trọn vẹn được.

Nghiên cứu về Flash và ngôn ngữ ActionScript, Flash có support RAW socket

Thế nhưng theo quan điểm của tôi thì sự kết hợp PHP và Javascript ( AJAX ) ở trên không là nguyên nhân chính gây ra tình trạng như DDoS, vì số lượng các request cỡ như cho một trình chat trực tuyến không thể "nhiều khủng khiếp" như DDoS được

Muốn xây một ứng dụng như meboo.com hay imo.im thì với hệ thống máy chủ yếu hom hem không thể nào hoạt động được dù là sử dụng RAW socket và dữ liệu PUSH đi là cực nhỏ và Client thụ động. Đó là vấn đề lớn hơn chính cái ứng dụng web kia

iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
  [Question]   Gọi một chương trình thực thi trong PHP? 22/04/2011 22:58:56 (+0700) | #5 | 236013
Phineas
Member

[Minus]    0    [Plus]
Joined: 24/10/2010 21:31:24
Messages: 8
Offline
[Profile] [PM]
Chào bạn,

Ý của mình chỉ là tìm ra giải pháp trao đổi realtime dữ liệu 2 chiều hiệu quả trong 2 trường hợp trên. Trong trường hợp đầu, giao tiếp giữa chương trình thực thi và trang PHP có thể thực hiện qua tập tin.
Còn trong trường hợp còn lại, giao tiếp giữa webclient và webserver:

- Số lượng request từ client đúng là không nhiều khủng khiếp như bạn nói, nhưng do client không thể biết được lúc nào thì trên server sẽ được cập nhật nên request có chu kỳ khoảng vài giây (3-4s) một lần cho mỗi client. Chưa cần nói đến việc server hom hem hay không, đây rõ ràng là một cách không hiệu quả.
- Dùng PUSH như bạn nói là một giải pháp mình đang cần. Nhưng mình không biết liệu có cách nào thực hiện điều đó trong phạm vi web app thông thường không (hoặc thay đổi một chút ở phía webserver cũng được)? RAW socket hay embeded server chỉ là phương án cuối cùng thôi.

-
Cám ơn bạn.

[Up] [Print Copy]
  [Question]   Gọi một chương trình thực thi trong PHP? 22/04/2011 23:11:42 (+0700) | #6 | 236014
[Avatar]
canh_nguyen
Elite Member

[Minus]    0    [Plus]
Joined: 23/08/2004 18:55:09
Messages: 775
Location: Broken dream
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

Phineas wrote:
Cám ơn bạn đã trả lời,

Thực ra do yêu câu của khách hàng, trang web mình viết có chức năng tương tự như meebo.com hay imo.im.
Hiện nay mình đang làm y chang như cách bạn nói, bên client dùng XMLHTTPObject bằng tay để cập nhận dữ liệu. Khổ nỗi, kiểu PULL này ngốn tài nguyên cả client lẫn server nhiều quá, do cứ định kỳ client lại request về server (y chang DoS), nên mình phải cần thêm khả năng PUSH từ phía server. <b>Không biết có thể giải quyết vấn đề này trong phạm vi web app php thông thường không nhỉ? Hay chỉnh lại config của Apache cũng được</b>

Cái RAW socket bạn nói là một dạng embedded webserver, mình mới google ra
www.koanlogic.com/klone/ cho phép nhúng C vào trong mã HTML (hay nhúng mã HTML vào C, :-D). Cái này có vẻ mới nên không chắc là có ổn định không nữa. Bạn nào xài rồi thì đánh giá dùm mình với.

Xài embedded server chỉ là cách cuối cùng, khi không còn cách nào khác để PUSH dữ liệu từ server một cách hiệu quả trong phạm vi <b>Apache - PHP/HTML - webclient</b> (1)

Bạn nào biết cách giải quyết vấn đề PUSH từ server này theo mô hình (1) trên thì chỉ cho mình với.

Cám ơn rất nhiều. 

Pull vẫn có khả năng giảm tải xuống nếu bạn đặt cho nó 1 ngưỡng delay.
Tìm hiểu Long-polling.
Để giảm tối đa thì dùng Http push để server chủ động 'đẩy' data xuống client nếu có thay đổi. Có 1 số keyword cho bạn :
Stream-hub : http://www.stream-hub.com/
CometD : http://cometd.org/,
NodeJs (Javascript Server Side) : http://nodejs.org/, thằng này support cả C/C++ addon có lẽ phù hợp nhất với bạn.
Nginx http://wiki.nginx.org/3rdPartyModules xem mấy cái module HTTP PUSH, HTTP PUSH Stream)
...
Hoặc trong 1 số thằng trên có support streaming thì bạn có thể dùng luôn cách streaming thử xem sao.
Websocket thì tạm thời chưa nghĩ tới smilie
[Up] [Print Copy]
  [Question]   Gọi một chương trình thực thi trong PHP? 23/04/2011 06:56:41 (+0700) | #7 | 236019
[Avatar]
xnohat
Moderator

Joined: 30/01/2005 13:59:19
Messages: 1210
Location: /dev/null
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!] [MSN]
Bồ phineas chưa đọc kỹ reply mới nhất của tôi rồi, tôi đã đề cập giải pháp push cho bồ rồi đấy smilie
iJust clear, "What I need to do and how to do it"/i
br
brBox tán gẫu dời về: http://www.facebook.com/hvaonline
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|