teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

test

2017/05/31 06:35

投稿

yambejp
yambejp

スコア117867

answer CHANGED
@@ -3,4 +3,94 @@
3
3
 
4
4
  前者であればpromise内でsetIntervalなどでxhr処理が終わっているかを
5
5
  繰り返しチェックし、上限が来たらrejectすればよいと思います
6
- 後者であればサーバー設定でできると思います
6
+ 後者であればサーバー設定でできると思います
7
+
8
+ # sample
9
+
10
+ よくよくテストしてみましたが
11
+ ignore_user_abort()をチェックするために出力が必要なようで、
12
+ そうとう姑息ですがこんな感じでどうでしょうか?
13
+
14
+ ※必要なファイル
15
+ - send.htm
16
+ - recv.php
17
+ - log.txt
18
+
19
+ ※テスト方法1
20
+ send.htmの※注1の7=最大7秒でタイムアウトする
21
+ recv.phpの※注2の5=5秒かんウェイトをかける
22
+ 結果:5秒間カウントダウンして、JSONデータを受け取る
23
+ このときlog.txtには5秒間カウントダウンしたデータが出力されている
24
+
25
+ ※テスト方法2
26
+ send.htmの※注1の7を2に書き換える=最大2秒でタイムアウトする
27
+ recv.phpの※注2の5=5秒かんウェイトをかける、そのまま
28
+ 結果:2秒間カウントダウンして、errになる
29
+ このときxhrがabortされ接続は切断されるので、logには2秒分のログしか残らない
30
+
31
+ send.htm
32
+ ```HTML
33
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
34
+ <script>
35
+ new Promise(function(resolver,rejector){
36
+ var timerId;
37
+ var fd=new FormData();
38
+ fd.append('x','test');
39
+ var xhr = new XMLHttpRequest();
40
+ xhr.open('POST','recv.php');
41
+ xhr.addEventListener("load" ,function() {
42
+ clearInterval(timerId);
43
+ return resolver(this);
44
+ });
45
+ var count=7;//※注1
46
+ timerId=setInterval(function(){
47
+ console.log(count);
48
+ count--;
49
+ if(count==0){
50
+ clearInterval(timerId);
51
+ xhr.abort();
52
+ return rejector(this);
53
+ }
54
+
55
+ },1000);
56
+ xhr.send(fd);
57
+ }).then(function(xhr){
58
+ console.log(JSON.parse(xhr.response));
59
+ console.log("end");
60
+ }).catch(function(){
61
+ console.log("err");
62
+ });
63
+ </script>
64
+
65
+ ```
66
+ recv.php
67
+ ```
68
+ <?PHP
69
+ ignore_user_abort(false);
70
+ set_time_limit(1);
71
+ set_error_handler('myErrorHandler');
72
+ function myErrorHandler($errno, $errstr){
73
+ if($errno==E_NOTICE and preg_match("/^ob_end_clean/",$errstr)){
74
+ return true;
75
+ }else{
76
+ return false;
77
+ }
78
+ }
79
+ file_put_contents('log.txt','');
80
+ for ( $i=0 ; $i<5; $i++){ //※注2:
81
+ echo("\r");
82
+ flush();
83
+ try{
84
+ ob_end_clean();
85
+ }catch(exception $e){
86
+ print $e->getMessage();
87
+ }
88
+
89
+ file_put_contents('log.txt',"$i..".connection_aborted()."(".connection_status().")".PHP_EOL,FILE_APPEND);
90
+ sleep(1);
91
+ }
92
+ print json_encode($_POST);
93
+ ?>
94
+ ```
95
+
96
+ log.txt:空ファイル