queue-producer.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. require dirname(__FILE__) . '/vendor/autoload.php';
  3. function texlive_task_message($s3_bucket_name)
  4. {
  5. $output = new Palm\Lily\V1\TeXLiveTask\Output();
  6. $output->setFormat(Palm\Lily\V1\TeXLiveTask\Output\Format::Pdf);
  7. $output->setBucket($s3_bucket_name);
  8. $output->setObject(Ramsey\Uuid\Uuid::uuid4()->toString() . '.pdf');
  9. $request = new Palm\Lily\V1\TeXLiveTask();
  10. $request->setEntry(file_get_contents('tex/main.tex'));
  11. foreach (array("coding.png", "foreword.tex", "section-1.tex", "section-2.tex", "postscript.tex") as $f) {
  12. $request->getAttachments()[$f] = file_get_contents('tex/' . $f);
  13. }
  14. $request->setOutput($output);
  15. return $request->serializeToString();
  16. }
  17. function pandoc_task_message($s3_bucket_name)
  18. {
  19. $input = new Palm\Lily\V1\PandocTask\Input();
  20. $input->setFormat(Palm\Lily\V1\PandocTask\Format::Markdown);
  21. $input->setPayload("# Hello, Lily!");
  22. $output = new Palm\Lily\V1\PandocTask\Output();
  23. $output->setFormat(Palm\Lily\V1\PandocTask\Format::Docx);
  24. $output->setBucket($s3_bucket_name);
  25. $output->setObject(Ramsey\Uuid\Uuid::uuid4()->toString() . '.docx');
  26. $request = new Palm\Lily\V1\PandocTask();
  27. $request->setInput($input);
  28. $request->setOutput($output);
  29. return $request->serializeToString();
  30. }
  31. function send_message($channel, $queue_name, $message_id, $message_body)
  32. {
  33. global $logger;
  34. $logger->info("send message", ['id' => $message_id]);
  35. $message = new PhpAmqpLib\Message\AMQPMessage(
  36. $message_body,
  37. properties: ['message_id' => $message_id, 'content_type' => 'application/grpc+proto']
  38. );
  39. $channel->basic_publish($message, '', $queue_name);
  40. }
  41. $logger = new Monolog\Logger('palm');
  42. $logger->pushHandler(new Monolog\Handler\StreamHandler('php://stdout', Monolog\Level::Debug));
  43. if (empty($argv[1]) or empty($argv[2]) or empty($argv[3])) {
  44. $logger->error("USAGE: " . $argv[0] . " CONFIG_FILE JOB QUEUE");
  45. exit(1);
  46. }
  47. $logger->debug("load config from", ['file' => $argv[1]]);
  48. $config = json_decode(file_get_contents($argv[1]));
  49. $logger->info("connect to", ['host' => $config->{'host'}, 'port' => $config->{'port'}, 'user' => $config->{'user'}]);
  50. $queue_connection = new PhpAmqpLib\Connection\AMQPStreamConnection(
  51. $config->{'host'},
  52. $config->{'port'},
  53. $config->{'user'},
  54. $config->{'password'},
  55. vhost: $config->{'virtual-host'}
  56. );
  57. $queue_channel = $queue_connection->channel();
  58. $queue_name = $argv[3];
  59. $logger->info("create queue", ['name' => $queue_name]);
  60. $queue_channel->queue_declare($queue_name, false, false, false, false);
  61. $s3_bucket_name = "testing";
  62. foreach (range(1, 10) as $i) {
  63. $message_id = Ramsey\Uuid\Uuid::uuid4()->toString();
  64. $message_properties = [];
  65. switch ($argv[2]) {
  66. case "pandoc":
  67. send_message($queue_channel, $queue_name, $message_id, pandoc_task_message($s3_bucket_name));
  68. break;
  69. case "texlive":
  70. send_message($queue_channel, $queue_name, $message_id, texlive_task_message($s3_bucket_name));
  71. break;
  72. default:
  73. $logger->error("unknown job", ['name' => $argv[2]]);
  74. exit(1);
  75. }
  76. sleep(1);
  77. }
  78. $queue_channel->close();
  79. $queue_connection->close();