项目作者: t3ran13

项目描述 :
PHP event listener for STEEM/GOLOS blockchain
高级语言: PHP
项目地址: git://github.com/t3ran13/golos-php-event-listener.git
创建时间: 2018-05-05T18:19:57Z
项目社区:https://github.com/t3ran13/golos-php-event-listener

开源协议:MIT License

下载


golos-php-event-listener

PHP event listener for STEEM/GOLOS blockchains

Install Via Composer

  1. composer require t3ran13/golos-php-event-listener

Basic Usage

For working you app you need

  • database manager
  • events handlers
  • start script for cron

Example below

  1. <?php
  2. namespace MyApp;
  3. use GolosPhpEventListener\app\process\BlockchainExplorerProcess;
  4. use GolosPhpEventListener\app\process\EventsHandlersProcess;
  5. use GrapheneNodeClient\Connectors\ConnectorInterface;
  6. use ProcessManager\db\RedisManager;
  7. use ProcessManager\ProcessManager;
  8. ini_set('display_errors', 1);
  9. ini_set('display_startup_errors', 1);
  10. error_reporting(E_ALL);
  11. define('PATH', __DIR__);
  12. require __DIR__ . "/Autoloader.php"; // only in GrapheneNodeClient project
  13. require __DIR__ . '/vendor/autoload.php';
  14. echo PHP_EOL . '------ start GOLOS EVENT LISTENER ------' . PHP_EOL;
  15. $db = new RedisManager();
  16. //Main process witch starts all other peocesses
  17. $pm = (new ProcessManager($db))
  18. ->setProcessName('MainProcess')
  19. ->setMaxRunningProcesses(3); //it is 4 total with MainProcess, MAX 512 MB RAM by default
  20. if ($pm->hasState()) {
  21. $pm->loadState();
  22. } else {
  23. $pm->setPriority(25)
  24. ->setExecutionStep(1)
  25. ->setMaxNTriesOfRun(0)
  26. ->setSecondsBetweenRuns(55)
  27. ->setMaxLifetimeWithoutResults(20)
  28. ->saveState();
  29. }
  30. // creating event handler
  31. $eh1 = (new PostIsCreatedEventHandler($db))
  32. ->setProcessName('GEV:votesOffafnur:1')
  33. ->generateIdFromProcessName()
  34. ->addCondition('op:1:voter','golosboard') //event trigger 1
  35. ->addCondition('op:0','vote'); //event trigger 2
  36. if ($eh1->hasState()) {
  37. $eh1->loadState();
  38. } else {
  39. $eh1->setPriority(35)
  40. ->setExecutionStep(1)
  41. ->setMaxNTriesOfRun(0)
  42. ->setSecondsBetweenRuns(10)
  43. ->setMaxLifetimeWithoutResults(15)
  44. ->saveState();
  45. }
  46. // creating event handler
  47. $eh2 = (new PostIsCreatedEventHandler($db))
  48. ->setProcessName('GEV:allComments:2')
  49. ->generateIdFromProcessName()
  50. ->addCondition('op:0','comment'); //event trigger 1
  51. if ($eh2->hasState()) {
  52. $eh2->loadState();
  53. } else {
  54. $eh2->setPriority(35)
  55. ->setExecutionStep(1)
  56. ->setMaxNTriesOfRun(0)
  57. ->setSecondsBetweenRuns(10)
  58. ->setMaxLifetimeWithoutResults(15)
  59. ->saveState();
  60. }
  61. // creating event handler
  62. $eh3 = (new PostIsCreatedEventHandler($db))
  63. ->setProcessName('GEV:allVotes:3')
  64. ->generateIdFromProcessName()
  65. ->addCondition('op:0','vote'); //event trigger 1
  66. if ($eh3->hasState()) {
  67. $eh3->loadState();
  68. } else {
  69. $eh3->setPriority(35)
  70. ->setExecutionStep(1)
  71. ->setMaxNTriesOfRun(0)
  72. ->setSecondsBetweenRuns(10)
  73. ->setMaxLifetimeWithoutResults(15)
  74. ->saveState();
  75. }
  76. // Creating blockchain lestener
  77. $BEP = (new BlockchainExplorerProcess($db,ConnectorInterface::PLATFORM_GOLOS))
  78. ->setProcessName('GEV:BlockchainExplorer')
  79. ->setLastBlock(16146488)
  80. ->addEvent($eh1) //do not forget add eventhandlers to explorer process
  81. ->addEvent($eh2) //adding event handler for detecting events
  82. ->addEvent($eh3);
  83. if ($BEP->hasState()) {
  84. $BEP->loadState();
  85. } else {
  86. $BEP->setPriority(30)
  87. ->setExecutionStep(1)
  88. ->setMaxNTriesOfRun(0)
  89. ->setSecondsBetweenRuns(30)
  90. ->setMaxLifetimeWithoutResults(20)
  91. ->saveState();
  92. }
  93. $pm->addProcess($BEP)
  94. ->addProcess($eh1)//add event listener for handling events
  95. ->addProcess($eh2)
  96. ->addProcess($eh3);
  97. $pm->start();

Add this script to cron.

Database manager

Lib use ready for using RedisManager from t3ran13/php-process-manager composer package, with next DB structure:

  1. - DB0
  2. - PM:GEV:{ProcessName}:{id}:className
  3. - PM:GEV:{ProcessName}:{id}:processName
  4. - PM:GEV:{ProcessName}:{id}:priority
  5. - PM:GEV:{ProcessName}:{id}:pid
  6. - PM:GEV:{ProcessName}:{id}:executionStep
  7. - PM:GEV:{ProcessName}:{id}:isRunning
  8. - PM:GEV:{ProcessName}:{id}:nTriesOfRun
  9. - PM:GEV:{ProcessName}:{id}:maxNTriesOfRun
  10. - PM:GEV:{ProcessName}:{id}:secondsBetweenRuns
  11. - PM:GEV:{ProcessName}:{id}:maxLifetimeWithoutResults
  12. - PM:GEV:{ProcessName}:{id}:lastUpdateDatetime
  13. - PM:GEV:{ProcessName}:{id}:data:*
  14. - PM:GEV:{ProcessName}:{id}:data:events:*
  15. - PM:GEV:{ProcessName}:{id}:errors:*

How to create onw DB manager, see t3ran13/php-process-manager

Events handlers

Each Handler have to implements EventHandlerInterface and ProcessManager\process\ProcessInterface, you can create onw or extends from EventHandlerAbstract.
When any event are found BlockchainExplorer make checking with isTrxSatisfiesConditions function and save to handling list if is it satisfied.
When EventHandlerProcess starts it handle all events from queue.

  1. <?php
  2. namespace MyApp;
  3. use GolosPhpEventListener\app\process\handlers\EventHandlerAbstract;
  4. class VoteHandler extends EventHandlerAbstract
  5. {
  6. public function start()
  7. {
  8. $events = $this->getEvents(); //TODO FIXME
  9. echo PHP_EOL . date('Y-m-d H:i:s') . $this->getProcessName() . ' is running and have total events='
  10. . count($events);
  11. foreach ($events as $key => $event) {
  12. // some code
  13. $this->setLastUpdateDatetime(date('Y-m-d H:i:s'))
  14. ->removeEventByKey($key)
  15. ->saveState();
  16. }
  17. }
  18. /**
  19. * ask process to start
  20. *
  21. * @return bool
  22. */
  23. public function isStartNeeded(): bool
  24. {
  25. return parent::isStartNeeded()
  26. && count($this->getEvents()) > 0;
  27. }
  28. }

Example

Example of the app base on golos-php-event-listener you can see here https://github.com/t3ran13/golos-rating-auto-reward