2017-07-13 88 views
1

目標

我正在開發一個JSON端點,當用戶向它發送GET請求時,基本上從服務器端COM端口讀取數據到文件中(在服務器端)。來自服務器的響應必須是正確形成的JSON響應,其中包含內容轉儲到的文件的名稱。如果COM端口響應時間過長,則該文件將關閉,並且無論從COM端口讀取什麼內容,該文件仍然被視爲有效。仍然提供有效的回覆。如果由於阻止io而導致腳本超時,我該如何生成自定義響應?

問題

當COM端口不再被供給數據時,它被阻塞,直到出腳本倍。這會導致錯誤,並且IIS在json端點上提供了一個通用錯誤頁面。這不是有效的json,但它也不包含com數據被轉儲到的文件的名稱。

詳細

  • 我必須使用PHP直接IO擴展了串行COM端口接口。
  • 這是阻塞IO,以及在Windows上,不支持異步IO(據我所看到的。)
  • register_shutdown_function不保證而連接仍然是開放的客戶端執行它,所以我不能用這將打印一個有效的響應。
+0

什麼決定了文件的名稱? PHP腳本是創建它還是已經存在? –

+0

文件名是在服務器端生成的。 Php腳本創建新文件。嗯,我可以讓客戶選擇它。儘管如此,必須有一些方法來阻止io。嗯。 – Jeremy

回答

1

對於您的JSON端點,您可以創建一個調用IO腳本的包裝腳本。爲嘗試從中獲取響應設置一個超時值,然後返回JSON,無論是從腳本獲取的任何內容,還是在腳本超時後返回一些自定義消息。

$timeout = 5; // some reasonable time less than the wrapper script timeout 

$data = ['filename' => 'something'];   // create the file name 
$q = http_build_query($data);     // pass it to the IO script 

$context = stream_context_create(['http'=> ['timeout' => $timeout]]); 
$response = file_get_contents("http://yourserver/io_script.php?$q", false, $context); 

echo json_encode($data + ['data' => $response ?: 'no data']); 
+1

謝謝。這似乎有點挑剔,但它似乎是最好的路線。我認爲最好的選擇是使用本地腳本執行IO並使用shell_exec執行(可以設置超時時間),並將超時設置爲小於set_time_limit設置的超時時間。這樣,只要支持set_time_limit,我就不會與服務器配置過多爭鬥。 – Jeremy

+0

是的,我同意聽起來更好。我回答說我知道你一定能夠根據你已經在做的事情來使用,因爲不是每個人都啓用了shell_exec。但總體思路是一樣的。 –

相關問題