diff --git a/bin/exampleWorker.php b/bin/exampleWorker.php new file mode 100644 index 0000000..d75b6b4 --- /dev/null +++ b/bin/exampleWorker.php @@ -0,0 +1,11 @@ + $value ) +{ + $lines[] = " * {$key}: {$value}"; +} + +echo implode( "\n", $lines ); diff --git a/bin/examples.php b/bin/examples.php new file mode 100644 index 0000000..af128a8 --- /dev/null +++ b/bin/examples.php @@ -0,0 +1,301 @@ + "\e[39m", + 'red' => "\e[31m", + 'green' => "\e[32m", + 'yellow' => "\e[33m", + 'blue' => "\e[34m", + 'gray' => "\e[94m", + ]; + + $headlineStr = ($headline === true) + ? sprintf( "%s%s%s\n", $colors[ $color ], str_repeat( '=', strlen( $text ) ), $colors['default'] ) + : ''; + + printf( "%s%s%s\n%s", $colors[ $color ], $text, $colors['default'], $headlineStr ); +} + +function printResponse( ProvidesResponseData $response ) +{ + printLine( "Response for request ID: {$response->getRequestId()}", 'green', true ); + printLine( $response->getBody() ); + printLine( 'Duration: ' . (string)$response->getDuration() ); +} + +$connection = new UnixDomainSocket( 'unix:///var/run/php/php7.1-fpm.sock' ); +$client = new Client( $connection ); + +$workerPath = __DIR__ . '/exampleWorker.php'; + +$request = new PostRequest( $workerPath, '' ); + +printLine( "\n" ); +printLine( 'hollodotme/fast-cgi-client examples', 'blue', true ); +printLine( 'Worker script: ' . $workerPath, 'blue' ); +printLine( 'Socket: ' . $connection->getHost(), 'blue' ); +printLine( "\n" ); + +sleep( 2 ); + +printLine( 'SINGLE REQUESTS', 'yellow', true ); +printLine( "\n" ); + +sleep( 2 ); + +# Sync request + +printLine( '# Sending one synchronous request... (worker sleeps 1 second)' ); +printLine( 'CODE: $client->sendRequest( $request );', 'red' ); +printLine( "\n" ); + +$request->setContent( http_build_query( [ 'sleep' => 1, 'key' => 'single synchronous request' ] ) ); + +sleep( 2 ); + +$response = $client->sendRequest( $request ); + +printResponse( $response ); +printLine( "\n" ); + +# Async request with read response + +printLine( '# Sending one asynchronous request... (worker sleeps 1 second)' ); +printLine( 'CODE: $client->sendAsyncRequest( $request );', 'red' ); +printLine( "\n" ); + +$request->setContent( http_build_query( [ 'sleep' => 1, 'key' => 'single asynchronous request' ] ) ); + +sleep( 2 ); + +$requestId = $client->sendAsyncRequest( $request ); + +printLine( "Sent request with ID: {$requestId}" ); + +printLine( "\n" ); +printLine( '# Now reading response...' ); +printLine( 'CODE: $response = $client->readResponse( $requestId );', 'red' ); +printLine( "\n" ); + +$response = $client->readResponse( $requestId ); + +printResponse( $response ); +printLine( "\n" ); + +# Async request with callback + +sleep( 2 ); + +printLine( '# Adding a response callback to request' ); +printLine( 'CODE: $request->addResponseCallbacks(', 'red' ); +printLine( ' function( ProvidesResponseData $response )', 'red' ); +printLine( ' {', 'red' ); +printLine( ' printLine(\'Callback notified!\', \'green\');', 'red' ); +printLine( ' printResponse($response);', 'red' ); +printLine( ' }', 'red' ); +printLine( ' );', 'red' ); +printLine( "\n" ); + +$request->setContent( http_build_query( [ 'sleep' => 1, 'key' => 'single asynchronous request with callback' ] ) ); +$request->addResponseCallbacks( + function ( ProvidesResponseData $response ) + { + printLine( 'Callback notified!', 'green' ); + printLine( "\n" ); + printResponse( $response ); + } +); + +sleep( 2 ); + +printLine( '# Sending one asynchronous request... (worker sleeps 1 second)' ); +printLine( 'CODE: $client->sendAsyncRequest( $request );', 'red' ); +printLine( "\n" ); + +sleep( 2 ); + +$requestId = $client->sendAsyncRequest( $request ); + +printLine( "Sent request with ID: {$requestId}" ); + +printLine( "\n" ); +printLine( '# Now waiting for response...' ); +printLine( 'CODE: $client->waitForResponse( $requestId );', 'red' ); +printLine( "\n" ); + +$client->waitForResponse( $requestId ); + +sleep( 2 ); + +# Async requests with read responses (order preserved) + +printLine( "\n" ); +printLine( 'MULTIPLE REQUEST', 'yellow', true ); +printLine( "\n" ); + +sleep( 2 ); + +printLine( '# Sending 3 asynchronous requests... (each worker sleeps 1 second)' ); +printLine( 'CODE: $client->sendAsyncRequest( $request1 );', 'red' ); +printLine( ' $client->sendAsyncRequest( $request2 );', 'red' ); +printLine( ' $client->sendAsyncRequest( $request3 );', 'red' ); +printLine( "\n" ); + +$request1 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 1, 'key' => 'Request 1' ] ) ); +$request2 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 1, 'key' => 'Request 2' ] ) ); +$request3 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 1, 'key' => 'Request 3' ] ) ); + +$requestIds = []; + +sleep( 2 ); + +$requestIds[] = $client->sendAsyncRequest( $request1 ); +$requestIds[] = $client->sendAsyncRequest( $request2 ); +$requestIds[] = $client->sendAsyncRequest( $request3 ); + +printLine( 'Sent requests with IDs: ' . implode( ', ', $requestIds ) ); + +printLine( "\n" ); +printLine( '# Now reading responses... (request order will be preserved)' ); +printLine( 'CODE: foreach($client->readResponses(null, ...$requestIds) as $response)', 'red' ); +printLine( ' {', 'red' ); +printLine( ' printResponse($response);', 'red' ); +printLine( ' }', 'red' ); +printLine( "\n" ); + +foreach ( $client->readResponses( null, ...$requestIds ) as $response ) +{ + printResponse( $response ); + printLine( "\n" ); +} + +printLine( "\n" ); + +# Async requests with read ready responses (reactive) + +sleep( 2 ); + +printLine( '# Sending 3 asynchronous requests... (worker sleep 3, 2, 1 seconds)' ); +printLine( 'CODE: $client->sendAsyncRequest( $request1 );', 'red' ); +printLine( ' $client->sendAsyncRequest( $request2 );', 'red' ); +printLine( ' $client->sendAsyncRequest( $request3 );', 'red' ); +printLine( "\n" ); + +$request1 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 3, 'key' => 'Request 1' ] ) ); +$request2 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 2, 'key' => 'Request 2' ] ) ); +$request3 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 1, 'key' => 'Request 3' ] ) ); + +$requestIds = []; + +sleep( 2 ); + +$requestIds[] = $client->sendAsyncRequest( $request1 ); +$requestIds[] = $client->sendAsyncRequest( $request2 ); +$requestIds[] = $client->sendAsyncRequest( $request3 ); + +printLine( 'Sent requests with IDs: ' . implode( ', ', $requestIds ) ); +printLine( "\n" ); +printLine( '# Now reading ready responses... (reactive)' ); +printLine( 'CODE: while($client->hasUnhandledResponses())', 'red' ); +printLine( ' {', 'red' ); +printLine( ' echo ".";', 'red' ); +printLine( ' foreach ($client->readReadyResponses() as $response)', 'red' ); +printLine( ' {', 'red' ); +printLine( ' printResponse( $response );', 'red' ); +printLine( ' }', 'red' ); +printLine( ' }', 'red' ); +printLine( "\n" ); + +while ( $client->hasUnhandledResponses() ) +{ + echo '.'; + + foreach ( $client->readReadyResponses() as $response ) + { + printLine( "\n" ); + printResponse( $response ); + printLine( "\n" ); + } +} + +printLine( "\n" ); + +# Async requests with callbacks waiting for responses (reactive) + +sleep( 2 ); + +printLine( '# Sending 3 asynchronous requests with callbacks... (worker sleep 2, 3, 1 seconds)' ); +printLine( 'CODE: $client->sendAsyncRequest( $request1 );', 'red' ); +printLine( ' $client->sendAsyncRequest( $request2 );', 'red' ); +printLine( ' $client->sendAsyncRequest( $request3 );', 'red' ); +printLine( "\n" ); + +$responseCallback = function ( ProvidesResponseData $response ) +{ + printLine( "\n" ); + printLine( 'Callback notified!', 'green' ); + printLine( "\n" ); + printResponse( $response ); +}; + +$request1 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 2, 'key' => 'Request 1' ] ) ); +$request2 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 3, 'key' => 'Request 2' ] ) ); +$request3 = new PostRequest( $workerPath, http_build_query( [ 'sleep' => 1, 'key' => 'Request 3' ] ) ); + +$request1->addResponseCallbacks( $responseCallback ); +$request2->addResponseCallbacks( $responseCallback ); +$request3->addResponseCallbacks( $responseCallback ); + +$requestIds = []; + +sleep( 2 ); + +$requestIds[] = $client->sendAsyncRequest( $request1 ); +$requestIds[] = $client->sendAsyncRequest( $request2 ); +$requestIds[] = $client->sendAsyncRequest( $request3 ); + +printLine( 'Sent requests with IDs: ' . implode( ', ', $requestIds ) ); + +printLine( "\n" ); +printLine( '# Now waiting for responses... (reactive)' ); +printLine( 'CODE: $client->waitForResponses()', 'red' ); +printLine( "\n" ); + +$client->waitForResponses(); + +printLine( "\n" ); +printLine( "\n" ); +printLine( 'Thanks for watching!', 'blue' ); +printLine( 'Get it on https://github.com/hollodotme/fast-cgi-client', 'blue' ); +printLine( "\n" ); diff --git a/bin/streamtest.php b/bin/streamtest.php deleted file mode 100644 index 4d7721a..0000000 --- a/bin/streamtest.php +++ /dev/null @@ -1,122 +0,0 @@ -addResponseCallbacks( - function ( ProvidesResponseData $response ) - { - echo $response->getRequestId() . "\n" . $response->getBody() . "\n" . $response->getDuration() . "\n\n"; - flush(); - } -); -$request->addFailureCallbacks( - function ( \Throwable $throwable ) - { - echo "!FAILURE! : {$throwable->getMessage()} (" . get_class( $throwable ) . ")\n\n"; - flush(); - } -); - -$request->setContent( http_build_query( [ 'sleep' => random_int( 1, 3 ), 'test-key' => 0 ] ) ); -$response = $client->sendRequest( $request ); - -echo '
', htmlspecialchars( print_r( $response, true ) ), '
'; - -for ( $i = 0; $i < (int)$argv[1]; $i++ ) -{ - $request->setContent( http_build_query( [ 'test-key' => $i, 'sleep' => random_int( 1, 3 ) ] ) ); - - $requestId = $client->sendAsyncRequest( $request ); - - echo "\nSent request {$requestId}"; - flush(); -} - -echo "\n\nWaiting for responses...\n\n"; - -$client->waitForResponses(); - -echo "Sending another {$argv[1]} requests...\n\n"; - -$request->setContent( http_build_query( [ 'sleep' => random_int( 1, 3 ), 'test-key' => 0 ] ) ); - -for ( $i = 0; $i < (int)$argv[1]; $i++ ) -{ - $request->setContent( http_build_query( [ 'test-key' => $i, 'sleep' => random_int( 1, 3 ) ] ) ); - - $requestId = $client->sendAsyncRequest( $request ); - - echo "\nSent request {$requestId}"; - flush(); -} - -while ( $client->hasUnhandledResponses() ) -{ - $requestIds = $client->getRequestIdsHavingResponse(); - - if ( empty( $requestIds ) ) - { - echo "No responses ready.\n\n"; - - usleep( 2000 ); - - continue; - } - - echo 'Request-IDs with response: ' . implode( ', ', $requestIds ) . "\n\n"; - - $client->handleResponses( null, ...$requestIds ); -} - -echo "Sending another {$argv[1]} requests...\n\n"; - -$request->setContent( http_build_query( [ 'sleep' => random_int( 1, 3 ), 'test-key' => 0 ] ) ); - -for ( $i = 0; $i < (int)$argv[1]; $i++ ) -{ - $request->setContent( http_build_query( [ 'test-key' => $i, 'sleep' => random_int( 1, 3 ) ] ) ); - - $requestId = $client->sendAsyncRequest( $request ); - - echo "\nSent request {$requestId}"; - flush(); -} - -while ( $client->hasUnhandledResponses() ) -{ - $client->handleReadyResponses(); -} - -die( 'done' ); diff --git a/src/Timing/Exceptions/TimerNotStartedException.php b/src/Timing/Exceptions/TimerNotStartedException.php deleted file mode 100644 index c359c25..0000000 --- a/src/Timing/Exceptions/TimerNotStartedException.php +++ /dev/null @@ -1,35 +0,0 @@ -