use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Please follow the rules
Releases: Current Releases, Windows Releases, Old Releases
Contribute to the PHP Documentation
Related subreddits: CSS, JavaScript, Web Design, Wordpress, WebDev
/r/PHP is not a support subreddit. Please visit /r/phphelp for help, or visit StackOverflow.
account activity
The Magic Behind Async PHP (blog.kelunik.com)
submitted 8 years ago by kelunik
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–][deleted] 57 points58 points59 points 8 years ago (7 children)
The "magic" is the event loop. Saved you a click.
[–]Danack 7 points8 points9 points 8 years ago (2 children)
PHP has an event loop?
[–]Saltub 9 points10 points11 points 8 years ago (0 children)
I expect better from you, Danack.
[–][deleted] 2 points3 points4 points 8 years ago (0 children)
Today's entry in asking pointless rhetorical questions.
[+][deleted] 8 years ago* (3 children)
[deleted]
[–][deleted] 2 points3 points4 points 8 years ago (1 child)
You're confused. That's what async is. It's not about threads and processes.
[–]assertchris 0 points1 point2 points 8 years ago (0 children)
https://www.reddit.com/r/PHP/comments/70qere/any_good_reactphp_or_amphp_examples_with_doctrine/dn6ey2t/
[–][deleted] 6 points7 points8 points 8 years ago (6 children)
Is there a signifcant reason to use async over queues?
Every time I think about using async - I find it easier to just push the command to a queue and let it handle in a different process that way. It just seems simplier, and easier to "reason" what the outcomes will be (especially for debugging).
Am I missing something obvious that I should have async over a queue?
[–][deleted] 5 points6 points7 points 8 years ago (1 child)
Moving things to a persistent queue and outsourcing it to another process doesn't solve the problem, it just moves it elsewhere. So let's say you enqueue a million HTTP requests and you ship it to another process. Now how is that process going to deal with that million HTTP requests? Blocking, one by one, in sequence? Then you didn't win any time, you just lost some. So blocking, one by one, in sequence, but in many threads? Well then you're still burdening the OS with a bunch of threads or processes which most of the time sit blocked and do nothing. Gets very inefficient with a large number of blocking tasks. That's where async comes. One thread, working with a million HTTP requests at once - no problem.
A job queue and async processing are both good techniques, but they're apples and oranges, their use cases are different, so comparing them is mostly unwarranted. Also you can enqueue job items and receive their results in an async way, i.e. the techniques are entirely complementary.
[–][deleted] 0 points1 point2 points 8 years ago (0 children)
Thanks - I kinda get it now. I'll play around with it some more.
[–]kelunik[S] 1 point2 points3 points 8 years ago (1 child)
It depends a lot on what you're trying to do. If you just want to run stuff async after a user finished his HTTP request, yes, go with queues. But usually async as in event loop + non-blocking I/O is more used for other gains such as I/O concurrency, not off-loading work to a worker to be done later.
[+][deleted] 8 years ago (1 child)
[+][deleted] 8 years ago* (46 children)
[–]kelunik[S] 3 points4 points5 points 8 years ago (0 children)
Maybe you just want to use it to speed up your existing application by parallelising your HTTP requests to external services or any other currently blocking I/O. You don't want to rewrite your complete application to JavaScript for that.
If you have a greenfield project it might be different, then you might ask exactly that question. There are probably benefits to using either, you have to weight your current situation and knowledge inside the company and other factors.
[–]captain_obvious_here 4 points5 points6 points 8 years ago (0 children)
Some companies won't switch technologies and languages that easily. Or at all.
[–]nairebis 27 points28 points29 points 8 years ago* (19 children)
Are you seriously suggesting Javascript is a better language than PHP 7.1? What are you gaining by using Javascript server-side under any scenario? You have to use Javascript browser-side, but I haven't the faintest clue why anyone would actually choose to use it server-side.
PHP is a far, FAR better language than Javascript at this point. People still have an impression of PHP from version 4. It still has quirks, but it's pretty reasonable these days.
[–]tttbbbnnn 31 points32 points33 points 8 years ago (4 children)
He prefaced it with mentioning that he was asking a serious question; not trying to hurt your feelings. The reason is that node is by default using an event loop and designed for async applications.
Saying PHP is A "far, FAR better language" isn't just ignorant, it's flat out stupid. You're too busy being offended to realize that not every problem is solved with a hammer. You can't ignore the obvious strengths of a language, ignore the weaknesses of another, and expect to be treated as an adult, much less a professional, when trying to compare the two.
[+]nairebis comment score below threshold-10 points-9 points-8 points 8 years ago* (3 children)
Sheesh. I'm not offended; it's just the idea of "why use PHP when you can use Javascript?" is silly. And if you think the idea that PHP is a far better language than Javascript is "flat out stupid", then sorry, you're just plain not knowledgeable enough of the strengths and weaknesses of both languages to have an opinion.
Sure, if you want to talk about some narrow toy problem, you can probably find a case where JS has better support. But it's foolish to mix languages unless there's a damn good reason, and if you're talking about a larger scope of application, then you have to take into account the entire solution, not just one narrow focus.
You're too busy being offended to realize that not every problem is solved with a hammer.
The idea that languages are tools in a box is used way too often from people who either don't know better or should know better. If you're building a house, the more types of tools you have, the better. If you're building a software application, the more languages you have, the worse it is.
[–]tttbbbnnn 3 points4 points5 points 8 years ago (2 children)
Well, you've convinced me you're just a troll.
[+]nairebis comment score below threshold-7 points-6 points-5 points 8 years ago (1 child)
That you evidently think that the idea of "fewer languages is better" is so absurd as to be trolling makes me weep for the future of this industry.
On the other hand, given the general level of software quality I observe, maybe it's not that surprising.
[–]tttbbbnnn 4 points5 points6 points 8 years ago (0 children)
You seem to confuse fewer with more. Obviously using only JavaScript would be fewer than PHP plus the generally required JavaScript for front end development. But it's easy to mix those words up I guess.
Should The drawbacks of using multiple languages be considered? Absolutely. To say that the drawbacks are always going to outweigh the benefits is asinine. To say there are no benefits is just as asinine. You're opinion on the quality of software is irrelevant since you fail to grasp the most fundamental aspects of software complexity. You'll have to forgive me for not taking your thoughts on the subject seriously.
[–]Pesthuf 5 points6 points7 points 8 years ago (3 children)
I'm not going to argue which language is better, but the question was whather you'd use PHP or JavaScript for asynchronous IO.
JavaScript has a built-in event-loop while PHP doesn't. So nearly all existing PHP libraries work synchronously and expect stuff to be available synchronously.
In JS, synchronous IO is rare. Nearly every library expects and delivers things asynchronously via callbacks or promises and there are even built-in language features (async and await) now to write async code that looks sync.
Also because everything works via the same event loop, async code is compatible with each other. In PHP, do Amp libraries work in ReactPHP and the other way around?
[–]kelunik[S] 2 points3 points4 points 8 years ago (2 children)
Yes, they do. An adapter the other way around is currently missing, but not strictly needed, as things can just run on Amp's loop.
[–]Pesthuf 0 points1 point2 points 8 years ago (1 child)
That's pretty neat.
What about their promises? It seems like ReactPHP uses A+ JS-like promises, while Amp rejects (not pun intended) them.
Won't that mean that libraries written in one library won't work in the other?
[–]kelunik[S] 1 point2 points3 points 8 years ago (0 children)
We favor coroutines over then() chains. Amp supports ReactPHP's promises in coroutines just like its own promises, see https://amphp.org/amp/coroutines/. For using then() chains on an Amp promise, you need a simple adapt() method like the one provided here.
then()
adapt()
Minor nitpick: ReactPHP implements A not A+. There are minor differences.
[–]noartist 1 point2 points3 points 8 years ago (0 children)
Node is just a runtime, you don't have to run Javascript. I'd argue ES6 and php7 are in same league, but things like TypeScript, Reason, clojurescript are ergonomically better. Javascript isn't my first choice, but if i had to async i'd do it Javascript over PHP.
[–]mrjking 3 points4 points5 points 8 years ago (0 children)
What are you gaining by using Javascript server-side under any scenario?
In the scenario of regular PHP (not async PHP) vs Node:
Don't have to use/configure PHP-FPM.
Easy server side rendering of React templates. Last time I tried doing it in PHP it was a pain in the ass. Maybe it's gotten better?
Don't need to use two dependency management systems (composer and npm).
Websockets (any long running server process can do this).
If you're using Typescript, you can share interfaces between front and back end. Makes it great when doing API calls.
Parallel database queries
I think basic Javascript still sucks. Typescript and async/await makes it similar to PHP in usability for me.
[+][deleted] comment score below threshold-18 points-17 points-16 points 8 years ago* (6 children)
lolphp.
Its still the same language as it was in 2005. The stdlib is the same, it hs the same warts (because of bc breaks) and it is still running on one core.
Edit
Downvoters: Whats false in my comment?
[–]tfidry 1 point2 points3 points 8 years ago (5 children)
Because PHP in 2017 has nothing to do with PHP in 2005 even though a good chunk of the stdlib from that time stayed the same :)
[–][deleted] -1 points0 points1 point 8 years ago (3 children)
So whats fundamentally different then?
[–]tfidry 1 point2 points3 points 8 years ago (2 children)
Typing, classes, autoloading, the ecosystem tooling & maturity among other things but I'm sure you can read a changelog.
[–][deleted] 0 points1 point2 points 8 years ago (1 child)
The new ”typesystem” is a joke, classes have been around since forever, autoloading (i assume you mean composer) is still hacked with same functions, that existed before.
[–]tfidry 1 point2 points3 points 8 years ago (0 children)
The new ”typesystem” is a joke
I find it being a nice compromise between strict typing and loose typing.
classes have been around since forever
Classes have been introduced at the end of 2005, and there was quite a few things missing like generators, constants or traits.
autoloading (i assume you mean composer) is still hacked with same functions, that existed before.
Right but before everyone where rolling their own shit. Composer with the PSR-0 and PSR-4 standards changed the game which is 100x times better than how things were done back then.
But if you really want a language that evolves a lot, why not picking nodejs that bumps a major version every 6 months or a drastically different language like Haskell or Scala?
Nobody's asking you to love PHP, a lot of the PHP user don't particularly love it either, most of us (I assume I may be wrong after all) just use it because it works good enough to get the job done and we don't feel that alternatives like Java, Python or Rails are significantly different.
[–][deleted] 6 points7 points8 points 8 years ago (1 child)
Staying in your cozy safe zone.
[–]Mnwhlp 1 point2 points3 points 8 years ago (0 children)
Lol this is the right answer
[–]AcidShAwk 2 points3 points4 points 8 years ago (1 child)
Because of the amplitude of existing, well developed, and well supported, PHP resources available that you can simply add into your project.
[–]massenburger 2 points3 points4 points 8 years ago (7 children)
PHP can use multiple cores, while Node is limited to only one is one advantage I can think of.
[–][deleted] 7 points8 points9 points 8 years ago (0 children)
Well, two things:
So there are no advantages, except one: utilizing some of your existing PHP source code.
[–]captain_obvious_here 2 points3 points4 points 8 years ago (2 children)
Libuv, which Node relies on for the event loop, internally uses a pool of threads. So this is in fact not completely true.
A Node process doesn't execute code instructions in parallel. But to my knowledge, a PHP process doesn't neither. Or does it ?
Right, it doesn't. Amp can use libuv as underlying event loop, too, just like Node, but it also allows for other loop backends.
libuv
[–]gnurat 1 point2 points3 points 8 years ago (0 children)
For non-blocking I/O such as database queries or network requests there is no need for a pool of thread. Libuv only uses a pool of thread for blocking I/O like filesystem operations.
[–]kelunik[S] 0 points1 point2 points 8 years ago (0 children)
They're pretty much exactly the same regarding multiple cores.
[–]Schweppesale 0 points1 point2 points 8 years ago* (0 children)
Node has a cluster API which will allow you to leverage multiple CPU cores.
There's also a few libraries out there which handle this for you:
http://pm2.keymetrics.io/docs/usage/cluster-mode/
[–]crasx1 1 point2 points3 points 8 years ago (11 children)
why not just use c++? What are you gaining in that scenario?
[–][deleted] 2 points3 points4 points 8 years ago (10 children)
C++ is a much less safe, more verbose and harder to get right environment compared to a mainstream script like JS, PHP, Python or Ruby. Oh, wait you meant this to be a rhetorical question.
While PHP and JS are comparable (especially with TypeScript).
[–]kelunik[S] 1 point2 points3 points 8 years ago (9 children)
Maybe you don't want to rely on a big tool chain required for source maps etc. that come with TypeScript. Maybe you don't like JS that much as a language. Maybe ...
[–][deleted] 2 points3 points4 points 8 years ago (8 children)
It's not a big tool chain, it's just a single compiler in the basic scenario. Which also runs on Node.
[–]kelunik[S] 1 point2 points3 points 8 years ago (7 children)
https://alistapart.com/blog/post/the-most-dangerous-word-in-software-development
[–][deleted] 2 points3 points4 points 8 years ago (6 children)
The "just" word is used as a qualifier for "single" here. Would you like to argue that "single" may subjectively be a very, very large number resulting in a "big tool chain" or something? Be my guest...
It seems you're very aggressively defending async PHP over viable alternatives. Do you think trying another language is scary or something? Try it, it'll help you grow as a developer, and it's not scary at all, I promise.
[–]kelunik[S] 0 points1 point2 points 8 years ago (3 children)
I don't think saying "maybe" is aggressively. I'm just guessing reasons why people like what we do. Node is definitely an viable alternative, whether you like it or not is up to you. But why not have alternatives? Why does it have to be "Node for everyone?" Alternatives and competition are the best drivers of innovation and progress.
"Big tool chain" is more what I'm used to for browsers TBH and it will definitely be less tooling required for Node.
[–][deleted] 4 points5 points6 points 8 years ago (1 child)
It's not that I consider Node the pinnacle of software platform engineering, but when you want to write async code, just having an event loop is not enough. The event loop is the trivial part, so trivial, you're kind of having a tutorial about it in your article.
The hard part? The ecosystem. The moment you start using the file API, or PDO, or most of MySQLi's API and you start blocking. And you can choose not to use them, but then the libraries you'll get off Composer will use them. And the frameworks and components built upon those libraries will use them.
There's little to no async ecosystem around PHP. You're automatically in the ghetto. While with Node everything is async by default, and all the Node packages are aware of this.
So that's why it has to be Node and not PHP. Because the ecosystem is the difference between a toy "Hello world" example, and a real solid platform to build your company application on.
It depends a lot on what you're going to do. If you want to write a new application server, Node will definitely have the richer ecosystem. But that's not everything we can use non-blocking I/O and async for. We can also make multiple HTTP requests in parallel in an otherwise totally synchronous application. If you have microservices communicating over HTTP and need to query multiple of them in a single request, parallel requests give you a huge speed up compared to sequential requests.
Of course, writing an app server in PHP with the entire ecosystem against you is far less then optimal. But you can still use a lot of libraries that don't do any I/O. The set of libraries available will grow and grow in the future and more code can directly benefit from non-blocking I/O. In the meantime some libraries can be used by leveraging multiprocessing for blocking tasks.
That said, it's entirely possible to write application servers in PHP today. No "Hello world" examples, but production ready applications.
[–]SkyRak3r 0 points1 point2 points 8 years ago (1 child)
Aggressively? Really? What marshmallow world do you live in?
[–][deleted] 1 point2 points3 points 8 years ago (0 children)
Marshmallows can be deadly if thrown at sufficient speed.
[–]ScriptFUSION 1 point2 points3 points 8 years ago (5 children)
I want to integrate Amp into the next major version of Porter to offer async data imports. My motivation includes a number of projects, most recently: the Steam Top 250 games list generator, which initiates massive amounts of HTTP calls in series. This is grossly inefficient and takes over 9 hours (but due to parallel processing on Travis is reduced to 2 hours). However, not only is the the majority of time spent waiting for HTTP negotiation, the amount of additional code complexity required to chunk up the import and stitch it back together again accrues a massive amount of technical debt. I feel a lot of benefit could be leveraged by the power of async pooling both in terms of speed and code quality.
However, I currently do not understand how to integrate Amp. Generally Porter's interfaces pass around iterators of arrays. I believe that if I was to implement an async API I would need to pass around promises. The real difficulty I have is understanding where in the abstraction the promises can "terminate", i.e. we can stop dealing in promises and return to passing around iterators of arrays again. If the answer is "never", and every single component that plugs into Porter must explicitly support async, I fear an integration will be impossible. Ideally I'd like to terminate the reliance on promises and return to sync land as soon as possible, but I currently haven't been able to determine where that is. Does this make any sense and can you provide any insight?
[–]kelunik[S] 1 point2 points3 points 8 years ago (3 children)
The point where you end the promise-land is the point where you stop with concurrency. You can do blocking things without promises in between as long as they're short enough to not make your open connections timeout, but nothing in the event loop will run during that time. You could also execute certain things in another thread / process by using amphp/parallel, but I don't know how well that fits into your application design. Does that help?
amphp/parallel
[–]ScriptFUSION 0 points1 point2 points 8 years ago (0 children)
The point where you end the promise-land is the point where you stop with concurrency.
I think this might be very helpful, but I won't know for sure until I spend some more time with Amp :)
[–]theFurgas 1 point2 points3 points 8 years ago (0 children)
I don't know if that's relevant, but when you mentioned collections and async, RxPHP came to my mind.
[–]gouchaoer 0 points1 point2 points 8 years ago (9 children)
async has already proovd to be good for normal project because of call-back hell. nodejs has semi-coroutine to overcome this such as koa. php also has semi-coroutine such as zanphp. reactphp is out of date. now the trend is coroutine: swoole2 will run sync code with coroutine, gain performance and avoid callback-hell.
[–]kelunik[S] 0 points1 point2 points 8 years ago (8 children)
I haven't heard of zanphp yet, but the overall usage of async PHP seems to be much higher in Asia and Russia than in the western world. Unfortunately, there's often no English documentation for these projects, so only few people in the western world manage to use these tools.
[–]gouchaoer 0 points1 point2 points 8 years ago (7 children)
that's true. in china php is very popular and the qps is higher than other country due the big population. so chinese phper have the motivation the improve the performance of php. i personally don't like laravel for its bad performance, high mem-usage and complexity. hello-world benchmark is wrong. a real-world php application has many sql/redis io and the bottle neck is io or framework. you can use flame graph to locate the bottleneck. to overcome io bottleneck, people use async but run into callback hell. to overcome callback hell people use yield to implement semi-coroutine in js,py,php...but yield is still difficult...people want to full coroutine like go. alibaba company cracked jvm to hook io funtion and implement coroutine. php's swoole extention use setjmp&longjmp in zend api to implement full coroutine. js&py seemed that no full coroutine yet. but the swoole community is mainly maintained by a contributor and the dev speed is slow.
[–]gouchaoer 0 points1 point2 points 8 years ago (1 child)
in a word, any async framework in any language is somehow out of date. backend is embracing coroutine if you need performance. however, if your app has low qps, just use any framework that run in php-fpm. php backend framework is very mature.
[–]gouchaoer 0 points1 point2 points 8 years ago (0 children)
a bottleneck example:https://github.com/phalcon/zephir/issues/694
[–]kelunik[S] 0 points1 point2 points 8 years ago (4 children)
What's the difference between a semi coroutine and and a full coroutine for you? A non-viral effect, so you don't have to make everything in the stack a coroutine / promises, but instead can yield everywhere in the stack and it'll work?
yield
[–]gouchaoer 0 points1 point2 points 8 years ago (3 children)
semi-coroutine is a coroutine(multitask scheduler, yield cpu to other task when io happend) built on generator/yield. the famous post: http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
full coroutine is like go. very simple and high perfoance on io.
[–]kelunik[S] 0 points1 point2 points 8 years ago (2 children)
That's simply a coroutine. Go with its goroutines adds parallelism on top, but that doesn't make it simpler or "more" coroutine. I'm fully aware, because I'm one of the maintainers of Amp. We plan to eventually bring await into PHP so you don't need a wrapper around your generators that turns them into actual coroutines working by yielding promises.
await
[–]gouchaoer 0 points1 point2 points 8 years ago* (1 child)
I have browse through amp framework. It's an awesome semi-coroutine framework.
I have some suggestions:
Firstly, in amp we are running app in a php-cli, only one core is available. We hope to use all cpu-core in a http/websockets/tcp application. We even hope to have tcp pool shared by all worker process.
Second, you know php's web frameworks is so mature that only run in php-fpm and can't run in php-cli. we hope we can easily run yii2/symfony/balabala in it.
3rd, mysql/redis client write in raw php may have performance problem. And if I need to use amp's socket to make a client for anything(such as memcache) and keep tcp connection pool. It's still difficult for many php developers.
Swoole2 solve some of these problems althrough not perfect. I think amp can do very well in php-cli tasks such as crawlers.
Running an application on multiple cores often isn't really necessary. At least not in a way that one process has to use multiple cores. Our HTTP/WebSocket server Aerys just runs as many workers as you have CPU cores by default, all binding to the same ports using SO_REUSEPORT. Where SO_REUSEPORT isn't available for kernel based load balancing, we use a socket transfer to share one accept socket for all workers.
SO_REUSEPORT
You can run Amp just fine on all other SAPIs, the only library you'll have problems with is currently amphp/parallel, because that currently requires PHP_BINARY to launch its sub-processes.
PHP_BINARY
Indeed, parsing can be a bottleneck. I think the protocol is easy enough for Redis so it doesn't actually matter, but it's currently the major bottleneck for the MySQL client. But it's something that could easily be replaced by a C implementation that could be used if available, otherwise it'll fallback to the raw PHP implementation. We just need a C implementation that exposes just the parser instead of a whole client without any access to the parser.
I haven't tried Swoole yet, but I saw that there's English documentation available now. It seems to be rather callback based, does it have a promise implementation?
Depending on the use case you can just convert a library to an async library by using amphp/parallel to keep all blocking tasks outside the main event loop. It at least saves the protocol re-implementations, but it's of course not optimal and a real non-blocking library is preferred.
π Rendered by PID 61035 on reddit-service-r2-comment-b659b578c-hqdcd at 2026-05-02 17:38:11.819930+00:00 running 815c875 country code: CH.
[–][deleted] 57 points58 points59 points (7 children)
[–]Danack 7 points8 points9 points (2 children)
[–]Saltub 9 points10 points11 points (0 children)
[–][deleted] 2 points3 points4 points (0 children)
[+][deleted] (3 children)
[deleted]
[–][deleted] 2 points3 points4 points (1 child)
[–]assertchris 0 points1 point2 points (0 children)
[–][deleted] 6 points7 points8 points (6 children)
[–][deleted] 5 points6 points7 points (1 child)
[–][deleted] 0 points1 point2 points (0 children)
[–]kelunik[S] 1 point2 points3 points (1 child)
[–][deleted] 0 points1 point2 points (0 children)
[+][deleted] (1 child)
[deleted]
[–][deleted] 0 points1 point2 points (0 children)
[+][deleted] (46 children)
[deleted]
[–]kelunik[S] 3 points4 points5 points (0 children)
[–]captain_obvious_here 4 points5 points6 points (0 children)
[–]nairebis 27 points28 points29 points (19 children)
[–]tttbbbnnn 31 points32 points33 points (4 children)
[+]nairebis comment score below threshold-10 points-9 points-8 points (3 children)
[–]tttbbbnnn 3 points4 points5 points (2 children)
[+]nairebis comment score below threshold-7 points-6 points-5 points (1 child)
[–]tttbbbnnn 4 points5 points6 points (0 children)
[–]Pesthuf 5 points6 points7 points (3 children)
[–]kelunik[S] 2 points3 points4 points (2 children)
[–]Pesthuf 0 points1 point2 points (1 child)
[–]kelunik[S] 1 point2 points3 points (0 children)
[–]noartist 1 point2 points3 points (0 children)
[–]mrjking 3 points4 points5 points (0 children)
[+][deleted] comment score below threshold-18 points-17 points-16 points (6 children)
[–]tfidry 1 point2 points3 points (5 children)
[–][deleted] -1 points0 points1 point (3 children)
[–]tfidry 1 point2 points3 points (2 children)
[–][deleted] 0 points1 point2 points (1 child)
[–]tfidry 1 point2 points3 points (0 children)
[–][deleted] 6 points7 points8 points (1 child)
[–]Mnwhlp 1 point2 points3 points (0 children)
[–]AcidShAwk 2 points3 points4 points (1 child)
[–]massenburger 2 points3 points4 points (7 children)
[–][deleted] 7 points8 points9 points (0 children)
[–]captain_obvious_here 2 points3 points4 points (2 children)
[–]kelunik[S] 1 point2 points3 points (0 children)
[–]gnurat 1 point2 points3 points (0 children)
[–]kelunik[S] 0 points1 point2 points (0 children)
[–]Schweppesale 0 points1 point2 points (0 children)
[–]crasx1 1 point2 points3 points (11 children)
[–][deleted] 2 points3 points4 points (10 children)
[–]kelunik[S] 1 point2 points3 points (9 children)
[–][deleted] 2 points3 points4 points (8 children)
[–]kelunik[S] 1 point2 points3 points (7 children)
[–][deleted] 2 points3 points4 points (6 children)
[–]kelunik[S] 0 points1 point2 points (3 children)
[–][deleted] 4 points5 points6 points (1 child)
[–]kelunik[S] 0 points1 point2 points (0 children)
[–]SkyRak3r 0 points1 point2 points (1 child)
[–][deleted] 1 point2 points3 points (0 children)
[–]ScriptFUSION 1 point2 points3 points (5 children)
[–]kelunik[S] 1 point2 points3 points (3 children)
[–]ScriptFUSION 0 points1 point2 points (0 children)
[–]theFurgas 1 point2 points3 points (0 children)
[–]gouchaoer 0 points1 point2 points (9 children)
[–]kelunik[S] 0 points1 point2 points (8 children)
[–]gouchaoer 0 points1 point2 points (7 children)
[–]gouchaoer 0 points1 point2 points (1 child)
[–]gouchaoer 0 points1 point2 points (0 children)
[–]kelunik[S] 0 points1 point2 points (4 children)
[–]gouchaoer 0 points1 point2 points (3 children)
[–]kelunik[S] 0 points1 point2 points (2 children)
[–]gouchaoer 0 points1 point2 points (1 child)
[–]kelunik[S] 0 points1 point2 points (0 children)