回答編集履歴

3

蛇足追記

2018/10/24 03:48

投稿

taka-saan
taka-saan

スコア665

test CHANGED
@@ -109,3 +109,39 @@
109
109
 
110
110
 
111
111
  ```
112
+
113
+
114
+
115
+ ---
116
+
117
+ お節介かもですが勉強中ということですので、敢えてアドバイスさせてください。
118
+
119
+
120
+
121
+ 質問欄に提示されていらっしゃるソースコードですと、
122
+
123
+ 「1秒ごとの処理」を行う時間がくるまで全力でループを回り続けています。
124
+
125
+ こうするとCPUは無駄に回り続け、他のプロセスに割り当てるられるはずだった
126
+
127
+ CPUリソースを浪費してしまいます。
128
+
129
+ 具体的に言うと、仮にCPUが1個のコンピュータであればCPUのロードが100%になってしまいます。
130
+
131
+ 実害的には、電力を浪費する、他の処理が重くなる、などです。
132
+
133
+
134
+
135
+ このようなコードは、効率が悪い、お行儀が悪い、というレベルよりもう少し罪が重い、
136
+
137
+ "書いてはならないコード"に該当してしまいます。
138
+
139
+ ですので、プログラマを目指されているのでしたら、理解されておくべきかなと思います。
140
+
141
+
142
+
143
+ 対処としては、みなさんがおっしゃっている回答のように、
144
+
145
+ 空ループで時間を潰さずに、時間がくるまでsleepやタイマを使って待ちます。
146
+
147
+ 待っている間はCPUが浪費されません。

2

コード

2018/10/24 03:48

投稿

taka-saan
taka-saan

スコア665

test CHANGED
@@ -13,3 +13,99 @@
13
13
 
14
14
 
15
15
  処理に0.1秒かかったとして、0.9秒usleepとか。
16
+
17
+
18
+
19
+ ---
20
+
21
+ 処理毎に毎回計測すると暴れないかわりに小さなズレは蓄積するので、
22
+
23
+ 最初に取った時刻からn秒後を基準として余りをusleepする例を書いてみました。
24
+
25
+
26
+
27
+ ```php
28
+
29
+ <?php
30
+
31
+ date_default_timezone_set('Asia/Tokyo');
32
+
33
+
34
+
35
+ $start = microtime(true);
36
+
37
+ for($i=1; $i<=100; $i++){
38
+
39
+
40
+
41
+ func1();
42
+
43
+ if( ($i % 10) == 1){
44
+
45
+ func10();
46
+
47
+ }
48
+
49
+
50
+
51
+ $end = microtime(true);
52
+
53
+ $n = (($start + $i) - $end)*1000*1000;
54
+
55
+ if( $n > 0 ){
56
+
57
+ usleep( $n );
58
+
59
+ }
60
+
61
+ }
62
+
63
+
64
+
65
+
66
+
67
+ //+++++++++++++++++++++++++++++++++++++++++++
68
+
69
+ function outputTime(){
70
+
71
+ $unixTime = explode( '.', microtime(true) );
72
+
73
+ $dispTime = date( 'Y/m/d H:i:s', $unixTime[0] ) . "." . substr( $unixTime[1].'0000', 0 , 3 );
74
+
75
+ return $dispTime;
76
+
77
+ }
78
+
79
+
80
+
81
+ function func1()
82
+
83
+ {
84
+
85
+ echo outputTime().PHP_EOL;
86
+
87
+ echo "1秒ごとに実行".PHP_EOL;
88
+
89
+
90
+
91
+ usleep( 200*1000 ); // 0.2秒かかるとする
92
+
93
+ }
94
+
95
+ function func10()
96
+
97
+ {
98
+
99
+ echo outputTime().PHP_EOL;
100
+
101
+ echo "10秒ごとに実行".PHP_EOL;
102
+
103
+
104
+
105
+ usleep( 300*1000 ); // 0.3秒かかるとする
106
+
107
+ }
108
+
109
+
110
+
111
+ ```

1

リンク追記

2018/10/23 10:49

投稿

taka-saan
taka-saan

スコア665

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  1秒から処理にかかった時間を差し引いたmicro秒の分だけを、
10
10
 
11
- usleep()でsleepしてあげればよいです。
11
+ [usleep()](http://php.net/manual/ja/function.usleep.php)でsleepしてあげればよいです。
12
12
 
13
13
 
14
14