{"id":19719740,"url":"https://github.com/resque/php-resque","last_synced_at":"2025-04-08T08:14:57.371Z","repository":{"id":10439371,"uuid":"65750106","full_name":"resque/php-resque","owner":"resque","description":"An implementation of Resque in PHP.","archived":false,"fork":false,"pushed_at":"2024-04-28T20:49:18.000Z","size":529,"stargazers_count":212,"open_issues_count":23,"forks_count":75,"subscribers_count":22,"default_branch":"develop","last_synced_at":"2024-05-16T12:43:04.593Z","etag":null,"topics":["enqueue","multiple-workers","php-port","php-resque","workers"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/resque.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE-OF-CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-08-15T17:12:37.000Z","updated_at":"2024-06-18T11:18:22.836Z","dependencies_parsed_at":"2024-06-18T11:28:25.612Z","dependency_job_id":null,"html_url":"https://github.com/resque/php-resque","commit_stats":{"total_commits":316,"total_committers":98,"mean_commits":"3.2244897959183674","dds":0.8417721518987342,"last_synced_commit":"78a8b4a17482c3aa9581be35f42c58a690d24c62"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/resque%2Fphp-resque","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/resque%2Fphp-resque/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/resque%2Fphp-resque/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/resque%2Fphp-resque/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/resque","download_url":"https://codeload.github.com/resque/php-resque/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247801173,"owners_count":20998339,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["enqueue","multiple-workers","php-port","php-resque","workers"],"created_at":"2024-11-11T23:09:10.386Z","updated_at":"2025-04-08T08:14:57.346Z","avatar_url":"https://github.com/resque.png","language":"PHP","readme":"# PHP Resque Worker (and Enqueue)\n\nPHP Resque is a Redis-backed library for creating background jobs, placing those\njobs on one or more queues, and processing them later.\n\n![PHP-Resque Logo](https://github.com/resque/php-resque/raw/develop/extras/php-resque.png)\n\n[![License (MIT)](https://img.shields.io/packagist/l/resque/php-resque.svg?style=flat-square)](https://github.com/resque/php-resque)\n[![PHP Version](https://img.shields.io/packagist/php-v/resque/php-resque.svg?style=flat-square\u0026logo=php\u0026logoColor=white)](https://packagist.org/packages/resque/php-resque)\n[![Latest Version](https://img.shields.io/packagist/v/resque/php-resque.svg?style=flat-square)](https://packagist.org/packages/resque/php-resque)\n[![Latest Unstable Version](https://img.shields.io/packagist/vpre/resque/php-resque.svg?style=flat-square)](https://packagist.org/packages/resque/php-resque)\n[![Downloads](https://img.shields.io/packagist/dt/resque/php-resque.svg?style=flat-square)](https://packagist.org/packages/resque/php-resque)\n\n[![Build Status](https://img.shields.io/github/checks-status/resque/php-resque/develop)]()\n[![Dependency Status](https://img.shields.io/librariesio/github/resque/php-resque.svg?style=flat-square)](https://libraries.io/github/resque/php-resque)\n\n[![Latest Release](https://img.shields.io/github/release/resque/php-resque.svg?style=flat-square\u0026logo=github\u0026logoColor=white)](https://github.com/resque/php-resque)\n[![Latest Release Date](https://img.shields.io/github/release-date/resque/php-resque.svg?style=flat-square\u0026logo=github\u0026logoColor=white)](https://github.com/resque/php-resque)\n[![Commits Since Latest Release](https://img.shields.io/github/commits-since/resque/php-resque/latest.svg?style=flat-square\u0026logo=github\u0026logoColor=white)](https://github.com/resque/php-resque)\n[![Maintenance Status](https://img.shields.io/maintenance/yes/2025.svg?style=flat-square\u0026logo=github\u0026logoColor=white)](https://github.com/resque/php-resque)\n\n[![Contributors](https://img.shields.io/github/contributors/resque/php-resque.svg?style=flat-square\u0026logo=github\u0026logoColor=white)](https://github.com/resque/php-resque)\n[![Chat on Slack](https://img.shields.io/badge/chat-Slack-blue.svg?style=flat-square\u0026logo=slack\u0026logoColor=white)](https://join.slack.com/t/php-resque/shared_invite/enQtNTIwODk0OTc1Njg3LWYyODczMTZjMzI2N2JkYWUzM2FlNDk5ZjY2ZGM4Njc4YjFiMzU2ZWFjOGQxMDIyNmE5MTBlNWEzODBiMmVmOTI)\n\n## Background\n\nResque was pioneered by GitHub, and written in Ruby. What you're seeing here\nstarted life as an almost direct port of the Resque worker and enqueue system to\nPHP.\n\nFor more information on Resque, visit the official GitHub project:\n \u003chttps://github.com/resque/resque\u003e\n\nFor further information, see the launch post on the GitHub blog:\n \u003chttp://github.com/blog/542-introducing-resque\u003e\n\n\u003e The PHP port does NOT include its own web interface for viewing queue stats,\n\u003e as the data is stored in the exact same expected format as the Ruby version of\n\u003e Resque.\n\nThe PHP port provides much the same features as the Ruby version:\n\n-   Workers can be distributed between multiple machines\n-   Includes support for priorities (queues)\n-   Resilient to memory leaks (forking)\n-   Expects failure\n\nIt also supports the following additional features:\n\n-   Has the ability to track the status of jobs\n-   Will mark a job as failed, if a forked child running a job does not exit\n    with a status code as `0`\n-   Has built in support for `setUp` and `tearDown` methods, called pre and post\n    jobs\n\nAdditionally it includes php-resque-scheduler, a PHP port of [resque-scheduler](http://github.com/resque/resque),\nwhich adds support for scheduling items in the future to Resque. It has been\ndesigned to be an almost direct-copy of the Ruby plugin\n\nAt the moment, php-resque-scheduler only supports delayed jobs, which is the\nability to push a job to the queue and have it run at a certain timestamp, or\nin a number of seconds. Support for recurring jobs (similar to CRON) is planned\nfor a future release.\n\nThis port was originally made by [Chris\nBoulton](https://github.com/chrisboulton), with maintenance by the community.\nSee \u003chttps://github.com/chrisboulton/php-resque\u003e for more on that history.\n\n## Requirements\n\n-   PHP 7.3+\n-   Redis 2.2+\n-   Optional but Recommended: Composer\n\n## Getting Started\n\nThe easiest way to work with php-resque is when it's installed as a Composer\npackage inside your project. Composer isn't strictly required, but makes life a\nlot easier.\n\nIf you're not familiar with Composer, please see \u003chttp://getcomposer.org/\u003e.\n\n1.  Run `composer require resque/php-resque`.\n\n2.  If you haven't already, add the Composer autoload to your project's\n    initialization file. (example)\n\n```php\nrequire 'vendor/autoload.php';\n```\n\n## Jobs\n\n### Queueing Jobs\n\nJobs are queued as follows:\n\n```php\n// Required if redis is located elsewhere\nResque\\Resque::setBackend('localhost:6379');\n\n$args = array(\n          'name' =\u003e 'Chris'\n        );\nResque\\Resque::enqueue('default', 'My_Job', $args);\n```\n\n### Defining Jobs\n\nEach job should be in its own class, and include a `perform` method.\n\n```php\nclass My_Job extends \\Resque\\Job\\Job\n{\n    public function perform()\n    {\n        // Work work work\n        echo $this-\u003eargs['name'];\n    }\n}\n```\n\nWhen the job is run, the class will be instantiated and any arguments will be\nset as an array on the instantiated object, and are accessible via\n`$this-\u003eargs`.\n\nAny exception thrown by a job will result in the job failing - be careful here\nand make sure you handle the exceptions that shouldn't result in a job failing.\n\nJobs can also have `setUp` and `tearDown` methods. If a `setUp` method is\ndefined, it will be called before the `perform` method is run. The `tearDown`\nmethod, if defined, will be called after the job finishes.\n\n```php\nclass My_Job extends \\Resque\\Job\\Job\n{\n    public function setUp(): void\n    {\n        // ... Set up environment for this job\n    }\n\n    public function perform()\n    {\n        // .. Run job\n    }\n\n    public function tearDown(): void\n    {\n        // ... Remove environment for this job\n    }\n}\n```\n\n### Dequeueing Jobs\n\nThis method can be used to conveniently remove a job from a queue.\n\n```php\n// Removes job class 'My_Job' of queue 'default'\nResque\\Resque::dequeue('default', ['My_Job']);\n\n// Removes job class 'My_Job' with Job ID '087df5819a790ac666c9608e2234b21e' of queue 'default'\nResque\\Resque::dequeue('default', ['My_Job' =\u003e '087df5819a790ac666c9608e2234b21e']);\n\n// Removes job class 'My_Job' with arguments of queue 'default'\nResque\\Resque::dequeue('default', ['My_Job' =\u003e array('foo' =\u003e 1, 'bar' =\u003e 2)]);\n\n// Removes multiple jobs\nResque\\Resque::dequeue('default', ['My_Job', 'My_Job2']);\n```\n\nIf no jobs are given, this method will dequeue all jobs matching the provided\nqueue.\n\n```php\n// Removes all jobs of queue 'default'\nResque\\Resque::dequeue('default');\n```\n\n### Tracking Job Statuses\n\nphp-resque has the ability to perform basic status tracking of a queued job. The\nstatus information will allow you to check if a job is in the queue, is\ncurrently being run, has finished, or has failed.\n\nTo track the status of a job, pass `true` as the fourth argument to\n`Resque\\Resque::enqueue`. A token used for tracking the job status will be returned:\n\n```php\n$token = Resque\\Resque::enqueue('default', 'My_Job', $args, true);\necho $token;\n```\n\nTo fetch the status of a job:\n\n```php\n$status = new Resque\\Job\\Status($token);\necho $status-\u003eget(); // Outputs the status\n```\n\nJob statuses are defined as constants in the `Resque\\Job\\Status` class. Valid\nstatuses include:\n\n-   `Resque\\Job\\Status::STATUS_WAITING` - Job is still queued\n-   `Resque\\Job\\Status::STATUS_RUNNING` - Job is currently running\n-   `Resque\\Job\\Status::STATUS_FAILED` - Job has failed\n-   `Resque\\Job\\Status::STATUS_COMPLETE` - Job is complete\n-   `false` - Failed to fetch the status; is the token valid?\n\nStatuses are available for up to 24 hours after a job has completed or failed,\nand are then automatically expired. A status can also forcefully be expired by\ncalling the `stop()` method on a status class.\n\n### Obtaining job PID ###\n\nYou can obtain the PID of the actual process doing the work through `Resque\\Job\\PID`. On a forking OS this will be the\nPID of the forked process.\n\nCAUTION: on a non-forking OS, the PID returned will be of the worker itself.\n\n```php\necho Resque\\Job\\PID::get($token);\n```\n\nFunction returns `0` if the `perform` hasn't started yet, or if it has already ended.\n\n## Delayed Jobs\n\nTo quote the documentation for the Ruby resque-scheduler:\n\n\u003e Delayed jobs are one-off jobs that you want to be put into a queue at some\npoint in the future. The classic example is sending an email:\n\n    require 'Resque.php';\n    require 'Scheduler.php';\n\n    $in = 3600;\n    $args = array('id' =\u003e $user-\u003eid);\n    Resque\\Scheduler::enqueueIn($in, 'email', 'SendFollowUpEmail', $args);\n\nThe above will store the job for 1 hour in the delayed queue, and then pull the\njob off and submit it to the `email` queue in Resque for processing as soon as\na worker is available.\n\nInstead of passing a relative time in seconds, you can also supply a timestamp\nas either a DateTime object or integer containing a UNIX timestamp to the\n`enqueueAt` method:\n\n    require 'Resque.php';\n    require 'Scheduler.php';\n\n    $time = 1332067214;\n    Resque\\Scheduler::enqueueAt($time, 'email', 'SendFollowUpEmail', $args);\n\n    $datetime = new DateTime('2012-03-18 13:21:49');\n    Resque\\Scheduler::enqueueAt($datetime, 'email', 'SendFollowUpEmail', $args);\n\nNOTE: resque-scheduler does not guarantee a job will fire at the time supplied.\nAt the time supplied, resque-scheduler will take the job out of the delayed\nqueue and push it to the appropriate queue in Resque. Your next available Resque\nworker will pick the job up. To keep processing as quick as possible, keep your\nqueues as empty as possible.\n\n## Workers\n\nWorkers work in the exact same way as the Ruby workers. For complete\ndocumentation on workers, see the original documentation.\n\nA basic \"up-and-running\" `bin/resque` file is included that sets up a running\nworker environment. (`vendor/bin/resque` when installed via Composer)\n\nThe exception to the similarities with the Ruby version of resque is how a\nworker is initially setup. To work under all environments, not having a single\nenvironment such as with Ruby, the PHP port makes _no_ assumptions about your\nsetup.\n\nTo start a worker, it's very similar to the Ruby version:\n\n```sh\n$ QUEUE=file_serve php bin/resque\n```\n\nIt's your responsibility to tell the worker which file to include to get your\napplication underway. You do so by setting the `APP_INCLUDE` environment\nvariable:\n\n```sh\n$ QUEUE=file_serve APP_INCLUDE=../application/init.php php bin/resque\n```\n\n_Pro tip: Using Composer? More than likely, you don't need to worry about\n`APP_INCLUDE`, because hopefully Composer is responsible for autoloading your\napplication too!_\n\nGetting your application underway also includes telling the worker your job\nclasses, by means of either an autoloader or including them.\n\nAlternately, you can always `include('bin/resque')` from your application and\nskip setting `APP_INCLUDE` altogether.  Just be sure the various environment\nvariables are set (`setenv`) before you do.\n\n### Logging\n\nThe port supports the same environment variables for logging to STDOUT. Setting\n`VERBOSE` will print basic debugging information and `VVERBOSE` will print\ndetailed information.\n\n```sh\n$ VERBOSE=1 QUEUE=file_serve bin/resque\n$ VVERBOSE=1 QUEUE=file_serve bin/resque\n```\n\n### Priorities and Queue Lists\n\nSimilarly, priority and queue list functionality works exactly the same as the\nRuby workers. Multiple queues should be separated with a comma, and the order\nthat they're supplied in is the order that they're checked in.\n\nAs per the original example:\n\n```sh\n$ QUEUE=file_serve,warm_cache bin/resque\n```\n\nThe `file_serve` queue will always be checked for new jobs on each iteration\nbefore the `warm_cache` queue is checked.\n\n### Running All Queues\n\nAll queues are supported in the same manner and processed in alphabetical order:\n\n```sh\n$ QUEUE='*' bin/resque\n```\n\n### Running Multiple Workers\n\nMultiple workers can be launched simultaneously by supplying the `COUNT`\nenvironment variable:\n\n```sh\n$ COUNT=5 bin/resque\n```\n\nBe aware, however, that each worker is its own fork, and the original process\nwill shut down as soon as it has spawned `COUNT` forks.  If you need to keep\ntrack of your workers using an external application such as `monit`, you'll need\nto work around this limitation.\n\n### Custom prefix\n\nWhen you have multiple apps using the same Redis database it is better to use a\ncustom prefix to separate the Resque data:\n\n```sh\n$ PREFIX=my-app-name bin/resque\n```\n\n### Setting Redis backend ###\n\nWhen you have the Redis database on a different host than the one the workers\nare running, you must set the `REDIS_BACKEND` environment variable:\n\n```sh\n$ REDIS_BACKEND=my-redis-ip:my-redis-port bin/resque\n```\n\n### Forking\n\nSimilarly to the Ruby versions, supported platforms will immediately fork after\npicking up a job. The forked child will exit as soon as the job finishes.\n\nThe difference with php-resque is that if a forked child does not exit nicely\n(PHP error or such), php-resque will automatically fail the job.\n\n### Signals\n\nSignals also work on supported platforms exactly as in the Ruby version of\nResque:\n\n-   `QUIT` - Wait for job to finish processing then exit\n-   `TERM` / `INT` - Immediately kill job then exit\n-   `USR1` - Immediately kill job but don't exit\n-   `USR2` - Pause worker, no new jobs will be processed\n-   `CONT` - Resume worker.\n\n### Process Titles/Statuses\n\nThe Ruby version of Resque has a nifty feature whereby the process title of the\nworker is updated to indicate what the worker is doing, and any forked children\nalso set their process title with the job being run. This helps identify running\nprocesses on the server and their resque status.\n\n**PHP does not have this functionality by default until 5.5.**\n\nA PECL module (\u003chttp://pecl.php.net/package/proctitle\u003e) exists that adds this\nfunctionality to PHP before 5.5, so if you'd like process titles updated,\ninstall the PECL module as well. php-resque will automatically detect and use\nit.\n\n### Resque Scheduler\n\nresque-scheduler requires a special worker that runs in the background. This\nworker is responsible for pulling items off the schedule/delayed queue and adding\nthem to the queue for resque. This means that for delayed or scheduled jobs to be\nexecuted, that worker needs to be running.\n\nA basic \"up-and-running\" `bin/resque-scheduler` file that sets up a\nrunning worker environment is included (`vendor/bin/resque-scheduler` when\ninstalled via composer). It accepts many of the same environment variables as\nthe main workers for php-resque:\n\n* `REDIS_BACKEND` - Redis server to connect to\n* `LOGGING` - Enable logging to STDOUT\n* `VERBOSE` - Enable verbose logging\n* `VVERBOSE` - Enable very verbose logging\n* `INTERVAL` - Sleep for this long before checking scheduled/delayed queues\n* `APP_INCLUDE` - Include this file when starting (to launch your app)\n* `PIDFILE` - Write the PID of the worker out to this file\n\nIt's easy to start the resque-scheduler worker using `bin/resque-scheduler`:\n    $ php bin/resque-scheduler\n\n## Event/Hook System\n\nphp-resque has a basic event system that can be used by your application to\ncustomize how some of the php-resque internals behave.\n\nYou listen in on events (as listed below) by registering with `Resque\\Event` and\nsupplying a callback that you would like triggered when the event is raised:\n\n```php\nResque\\Event::listen('eventName', [callback]);\n```\n\n`[callback]` may be anything in PHP that is callable by `call_user_func_array`:\n\n-   A string with the name of a function\n-   An array containing an object and method to call\n-   An array containing an object and a static method to call\n-   A closure (PHP 5.3+)\n\nEvents may pass arguments (documented below), so your callback should accept\nthese arguments.\n\nYou can stop listening to an event by calling `Resque\\Event::stopListening` with\nthe same arguments supplied to `Resque\\Event::listen`.\n\nIt is up to your application to register event listeners. When enqueuing events\nin your application, it should be as easy as making sure php-resque is loaded\nand calling `Resque\\Event::listen`.\n\nWhen running workers, if you run workers via the default `bin/resque` script,\nyour `APP_INCLUDE` script should initialize and register any listeners required\nfor operation. If you have rolled your own worker manager, then it is again your\nresponsibility to register listeners.\n\nA sample plugin is included in the `extras` directory.\n\n### Events\n\n#### beforeFirstFork\n\nCalled once, as a worker initializes. Argument passed is the instance of\n`Resque\\Worker\\ResqueWorker` that was just initialized.\n\n#### beforeFork\n\nCalled before php-resque forks to run a job. Argument passed contains the\ninstance of `Resque\\JobHandler` for the job about to be run.\n\n`beforeFork` is triggered in the **parent** process. Any changes made will be\npermanent for as long as the **worker** lives.\n\n#### afterFork\n\nCalled after php-resque forks to run a job (but before the job is run). Argument\npassed contains the instance of `Resque\\JobHandler` for the job about to be run.\n\n`afterFork` is triggered in the **child** process after forking out to complete\na job. Any changes made will only live as long as the **job** is being\nprocessed.\n\n#### beforePerform\n\nCalled before the `setUp` and `perform` methods on a job are run. Argument\npassed contains the instance of `Resque\\JobHandler` for the job about to be run.\n\nYou can prevent execution of the job by throwing an exception of\n`Resque\\Exceptions\\DoNotPerformException`. Any other exceptions thrown will be treated as if they\nwere thrown in a job, causing the job to fail.\n\n#### afterPerform\n\nCalled after the `perform` and `tearDown` methods on a job are run. Argument\npassed contains the instance of `Resque\\JobHandler` that was just run.\n\nAny exceptions thrown will be treated as if they were thrown in a job, causing\nthe job to be marked as having failed.\n\n#### onFailure\n\nCalled whenever a job fails. Arguments passed (in this order) include:\n\n-   Exception - The exception that was thrown when the job failed\n-   Resque\\JobHandler - The job that failed\n\n#### beforeEnqueue\n\nCalled immediately before a job is enqueued using the `Resque\\Resque::enqueue` method.\nArguments passed (in this order) include:\n\n-   Class - string containing the name of the job to be enqueued\n-   Arguments - array of arguments for the job\n-   Queue - string containing the name of the queue the job is to be enqueued in\n-   ID - string containing the token of the job to be enqueued\n\nYou can prevent enqueing of the job by throwing an exception of\n`Resque\\Exceptions\\DoNotCreateException`.\n\n#### afterEnqueue\n\nCalled after a job has been queued using the `Resque\\Resque::enqueue` method. Arguments\npassed (in this order) include:\n\n-   Class - string containing the name of scheduled job\n-   Arguments - array of arguments supplied to the job\n-   Queue - string containing the name of the queue the job was added to\n-   ID - string containing the new token of the enqueued job\n\n### afterSchedule\n\nCalled after a job has been added to the schedule. Arguments passed are the\ntimestamp, queue of the job, the class name of the job, and the job's arguments.\n\n### beforeDelayedEnqueue\n\nCalled immediately after a job has been pulled off the delayed queue and right\nbefore the job is added to the queue in resque. Arguments passed are the queue\nof the job, the class name of the job, and the job's arguments.\n\n## Step-By-Step\n\nFor a more in-depth look at what php-resque does under the hood (without needing\nto directly examine the code), have a look at `HOWITWORKS.md`.\n\n## Contributors\n\n### Project Creator\n\n-   @chrisboulton\n\n### Project Maintainers\n\n-   @danhunsaker\n-   @rajibahmed\n-   @steveklabnik\n\n### Others\n\n-   @acinader\n-   @ajbonner\n-   @andrewjshults\n-   @atorres757\n-   @benjisg\n-   @biinari\n-   @cballou\n-   @chaitanyakuber\n-   @charly22\n-   @CyrilMazur\n-   @d11wtq\n-   @dceballos\n-   @ebernhardson\n-   @hlegius\n-   @hobodave\n-   @humancopy\n-   @iskandar\n-   @JesseObrien\n-   @jjfrey\n-   @jmathai\n-   @joshhawthorne\n-   @KevBurnsJr\n-   @lboynton\n-   @maetl\n-   @matteosister\n-   @MattHeath\n-   @mickhrmweb\n-   @Olden\n-   @patrickbajao\n-   @pedroarnal\n-   @ptrofimov\n-   @rayward\n-   @richardkmiller\n-   @Rockstar04\n-   @ruudk\n-   @salimane\n-   @scragg0x\n-   @scraton\n-   @thedotedge\n-   @tonypiper\n-   @trimbletodd\n-   @warezthebeef\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fresque%2Fphp-resque","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fresque%2Fphp-resque","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fresque%2Fphp-resque/lists"}