1
+ <?php
2
+ use Swoole \Coroutine \Http \Server ;
3
+
4
+ class fileserver {
5
+ private $ host ;
6
+ private $ port ;
7
+ private $ cert ;
8
+ private $ key ;
9
+ private $ server ;
10
+ private $ dir ;
11
+ public function __construct ($ host ,$ port ,$ cert ,$ key ,$ dir ) {
12
+ $ this ->host = $ host ;
13
+ $ this ->port = $ port ;
14
+ $ this ->cert = $ cert ;
15
+ $ this ->key = $ key ;
16
+ $ this ->dir = $ dir ;
17
+ }
18
+
19
+ public function startserver () {
20
+ $ this ->server = $ server = new Server ($ this ->host , $ this ->port , SWOOLE_PROCESS , SWOOLE_SOCK_TCP | SWOOLE_SSL );
21
+ $ server ->set ([
22
+ 'ssl_cert_file ' => './cert/ ' .$ this ->cert ,
23
+ 'ssl_key_file ' => './cert/ ' .$ this ->key ,
24
+ 'open_http2_protocol ' => true ,
25
+ ]);
26
+ $ server ->handle ('/ ' , function ($ request , $ response ) {
27
+ $ code = 404 ;
28
+ $ response ->status ($ code );
29
+ $ response ->header ('Content-Type ' , 'text/html; charset=utf-8 ' );
30
+ $ response ->end ("<title>Error</title><pre>404 Not Found</pre> " );
31
+ if (!isset ($ request ->server ['query_string ' ])){
32
+ $ url = $ request ->server ['request_uri ' ];
33
+ }
34
+ else {
35
+ $ url = $ request ->server ['request_uri ' ]."? " .$ request ->server ['query_string ' ];
36
+ }
37
+ mlog (" Serve {$ code } | {$ request ->server ['remote_addr ' ]} | {$ request ->server ['server_protocol ' ]} | {$ url } | {$ request ->header ['user-agent ' ]}; " ) ;
38
+ });
39
+ $ server ->handle ('/download ' , function ($ request , $ response ) {
40
+ $ response ->end ("Test " );
41
+ echo "download " ;
42
+ mlog (" Serve {$ code } | {$ request ->server ['remote_addr ' ]} | {$ request ->server ['server_protocol ' ]} | {$ request ->server ['request_uri ' ]}? {$ request ->server ['query_string ' ]} | {$ request ->header ['user-agent ' ]}; " ) ;
43
+ });
44
+ $ server ->handle ('/measure ' , function ($ request , $ response ) {
45
+ $ measuresize = str_replace ('/measure/ ' , '' , $ request ->server ['request_uri ' ]);
46
+ echo $ measuresize ;
47
+ if (!file_exists ($ this ->dir .'/measure ' )) {
48
+ mkdir ($ this ->dir .'/measure ' ,0777 ,true );
49
+ }
50
+ if (is_numeric ($ measuresize )){
51
+ if (!file_exists ($ this ->dir .'/measure/ ' .$ measuresize )) {
52
+ $ file = fopen ($ this ->dir .'/measure/ ' .$ measuresize , 'w+ ' );
53
+ $ bytesToWrite = $ measuresize * 1048576 ;
54
+ $ fillChar = str_repeat ("\0" , 1024 );
55
+ while ($ bytesToWrite > 0 ) {
56
+ $ chunkSize = min (1024 , $ bytesToWrite );
57
+ fwrite ($ file , substr ($ fillChar , 0 , $ chunkSize ));
58
+ $ bytesToWrite -= $ chunkSize ;
59
+ }
60
+ fclose ($ file );
61
+ }
62
+ $ code = 200 ;
63
+ $ response ->header ('Content-Type ' , 'application/octet-stream ' );
64
+ $ response ->sendfile ($ this ->dir .'/measure/ ' .$ measuresize );
65
+ }
66
+ else {
67
+ $ code = 404 ;
68
+ $ response ->status ($ code );
69
+ $ response ->header ('Content-Type ' , 'text/html; charset=utf-8 ' );
70
+ $ response ->end ("<title>Error</title><pre>404 Not Found</pre> " );
71
+ }
72
+ if (!isset ($ request ->server ['query_string ' ])){
73
+ $ url = $ request ->server ['request_uri ' ];
74
+ }
75
+ else {
76
+ $ url = $ request ->server ['request_uri ' ]."? " .$ request ->server ['query_string ' ];
77
+ }
78
+ mlog (" Serve {$ code } | {$ request ->server ['remote_addr ' ]} | {$ request ->server ['server_protocol ' ]} | {$ url } | {$ request ->header ['user-agent ' ]}; " ) ;
79
+ });
80
+ mlog ("Start Http Server on {$ this ->host }: {$ this ->port }" );
81
+ $ server ->start ();
82
+ }
83
+ public function stopserver () {
84
+ mlog ("Stop Http Server " );
85
+ $ this ->server ->shutdown ();
86
+ }
87
+ }
0 commit comments