public function testDogPile()
 {
     for ($t = 1; $t < 3; $t++) {
         $pid = pcntl_fork();
         if ($pid == -1) {
             die('could not fork');
         }
         if ($pid == 0) {
             break;
         }
     }
     $c = 10;
     $m = new AntiDogPileMemcache(false, array());
     $m->addServer('localhost', 11212, 0);
     if ($t == 1) {
         echo "THREAD | SECOND | STATUS\n";
     }
     for ($i = 0; $i < $c; $i++) {
         sleep(1);
         if (false === ($v = $m->getAdp('key'))) {
             echo sprintf("%6s | %6s | %s\n", $t, $i, "STALE!");
             sleep(1);
             $v = time();
             $m->setAdp('key', $v, 2);
             echo sprintf("%6s | %6s | %s\n", $t, $i, "SET {$v}");
         } else {
             echo sprintf("%6s | %6s | %s\n", $t, $i, $v);
         }
     }
     sleep(3);
 }
 /**
  * @param      $sObjectType
  * @param      $id
  * @param bool $refresh
  *
  * @return array|bool|mixed|\Phpforce\SoapClient\Result\SObject[]|\Traversable|void
  */
 public function get($sObjectType, $id, $refresh = false)
 {
     $fields = false;
     $object = false;
     if (!$refresh) {
         $object = $this->memcached->get('salesforce.object.' . $id);
     }
     if (!$object) {
         // Get fields from memcache
         if (!$refresh) {
             $fields = $this->memcached->get('salesforce.objectFields.' . $sObjectType);
         }
         try {
             // If no data, ask Salesforce and save to memcached.
             if (!$fields) {
                 $obj = $this->soapClient->call('describeSObject', array('sObjectType' => $sObjectType));
                 $fields = array();
                 foreach ($obj->getFields() as $field) {
                     $fields[] = $field->getName();
                 }
                 $this->memcached->set('salesforce.objectFields.' . $sObjectType, $fields, $this->memcached_ttl);
             }
             // TODO: Log Salesforce Query and Result
             $object = $this->soapClient->retrieve($fields, array($id), $sObjectType);
             $object = $object[0];
             // Set Memcached
             $this->memcached->set('salesforce.object.' . $id, $object, $this->memcached_ttl);
         } catch (\Exception $e) {
         }
     }
     return $object;
 }
 /**
  * Execute the CLI task
  *
  * @param InputInterface  $input  Command input
  * @param OutputInterface $output Command output
  *
  * @return void
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $pool = $input->getArgument('pool');
     try {
         $this->memcache = $this->getContainer()->get('memcache.' . $pool);
         $output->writeln($this->memcache->flush() ? '<info>OK</info>' : '<error>ERROR</error>');
     } catch (ServiceNotFoundException $e) {
         $output->writeln("<error>pool '{$pool}' is not found</error>");
     }
 }
Esempio n. 4
0
 /**
  * Flushes all queue changes to the server.
  *
  * @param \SplQueue $queue
  */
 public function flush(\SplQueue $queue)
 {
     if ($this->locked) {
         $this->memcache->delete('queue.manager');
         $this->memcache->set('queue.manager', serialize($queue));
         $this->locked = false;
         $this->memcache->delete('queue.manager.lock');
     } else {
         $this->eventDispatcher->dispatch('queue.manager.flushed', new ManagerFlushedEvent(ManagerFlushedEvent::STATUS_FLUSH_FAILED_NOLOCK));
     }
 }
Esempio n. 5
0
 /**
  * Registers all event listeners related to the manager.
  *
  * @param bool $verbose
  */
 public function registerListeners($verbose = false)
 {
     $output = $this->output;
     $this->eventDispatcher->addListener('queue.process_queued', function (ProcessQueuedEvent $event) use($verbose, &$output) {
         $output->writeln('<info>Process \'' . $event->getId() . '\' was added to the queue.</info>');
     });
     $this->eventDispatcher->addListener('queue.process_failed', function (ProcessFinishedEvent $event) use(&$output) {
         $status = [2 => 'TIMEOUT', 3 => 'ERROR IN RESPONSE'];
         $this->output->writeln('<error>Process \'' . $event->getName() . '\' was killed with an error.</error>');
         $this->output->writeln('<error>Status: ' . $status[$event->getStatus()] . '</error>');
         $this->memcache->delete('queue.process.processlist.' . $event->getName());
     });
     $this->eventDispatcher->addListener('queue.manager.retrieved', function (ManagerRetrievedEvent $event) use($verbose, &$output) {
         $errors = [ManagerRetrievedEvent::RETRIEVAL_STATUS_FAILED => 'Failed to retrieve the manager. Key not found.'];
         $warnings = [ManagerRetrievedEvent::RETRIEVAL_STATUS_FAILED_LOCKED => 'Attempted to retrieve the manager, but it was locked. Retrying in a few moments.'];
         if (isset($errors[$event->getStatus()])) {
             $this->output->writeln('<error>' . $errors[$event->getStatus()] . '</error>');
         }
         if (isset($warnings[$event->getStatus()]) && $verbose) {
             $this->output->writeln('<bg=yellow>' . $warnings[$event->getStatus()] . '</>');
         }
     });
     $this->eventDispatcher->addListener('queue.manager.flushed', function (ManagerFlushedEvent $event) use($verbose, &$output) {
         switch ($event->getStatus()) {
             case ManagerFlushedEvent::STATUS_FLUSH_FAILED_NOLOCK:
                 $output->writeln('<error>Could not flush the queue to the queue server. ' . 'Reason: the queue manager is locked.</error>');
                 break;
             case ManagerFlushedEvent::STATUS_FLUSH_FAILED:
                 $output->writeln('<error>Could not flush the queue to the queue server. ' . 'Reason: the server is unreachable.');
                 break;
             case ManagerRetrievedEvent::RETRIEVAL_STATUS_SUCCESS:
                 if ($verbose) {
                     $output->writeln('<info>The queue manager has been flushed.</info>');
                 }
                 break;
         }
     });
     $this->eventDispatcher->addListener('queue.process_ended', function (ProcessFinishedEvent $event) use($verbose, &$output) {
         $output->writeln('<info>Process \'' . $event->getName() . '\' has finished.</info>');
         if ($verbose && !empty($event->getOutput())) {
             $output->writeln('Output: ' . $event->getOutput());
         }
         $this->memcache->delete('queue.process.processlist.' . $event->getName());
     });
     $this->eventDispatcher->addListener('queue.process_started', function (ProcessStartedEvent $event) use($verbose, &$output) {
         $output->writeln('<info>Process \'' . $event->getName() . '\' has just been dispatched.</info>');
     });
 }