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>"); } }
/** * 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)); } }
/** * 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>'); }); }