This is really nice work Perk!
Thanks krisis, and welcome to the Cache.
If I understand your code correctly, it executes a background process for each spiderlet, up to 10 max at any time. The crawler script finishes when there are no more pages in the database to spider.
I haven't looked at this version of my spider for a while, because this is actually a scaled down version for posting here. Fair to say that I've kept a little bit of juice for myself

1) What is the maximum number of spiderlets you've tried successfully?
In my production version, I have a table called "sys_vars" that the dispatcher looks to to decide how many can be run at once. Rather than semaphores or any other complexity, I just do a shell_exec('ps aux') into a var then regex out the spider processes so that I get a current count - much more effective than any other forms of communication. And I can also monitor how long a spiderlet has been working on a single URL to see if it needs to be killed. I don't run this on dedicated machines, so I've never really pushed it beyond about 100 spiderlets. Remember that the real bottleneck is in waiting for the response, not processing... so this type of system is pretty light on the processor.
2) I assume this could be changed to run instead with a WHILE(TRUE), and a few other modifications, so that it runs like a service that keep checking the database for new URLs to spider instead of stopping when there are no more left in queue?
Absolutely. My email blaster works on a similar system, although it only does [a certain amount of emails] per minute, and then a cron job re-fires it up once a minute. The combination of number-of-blastlets and at-a-certain-interval cron mechanism makes throttling really easy, which is particularly important with eblasting.
3) Can you please explain the CrawlState field? 1 seems to be for pages waiting for crawl, 0 for pages that have been crawled, and -1 for currently being crawled or failed?
Pretty much right on, couple more details. (I don't remember all the state codes, but I'll expand on what I use it for)
When I respider a site, I'll set everything I know about to a state of 0 so that I know what needs to be crawled. If the page is no longer available I know it... if the page is newly orphaned I know it and so forth. The "newly orphaned" feature is particularly handy when working with my own sites and I want to know if I am dropping anything important for the search engines. In my production version I also use states to identify 301s and 302s, temporarily unavailables etc.
4) What are the LastPing and NextPing fields for? they don't seem to be used within your code.
I watch sites that are linked to me as well... I want to see the last time I checked [that] page and have a schedule for when I next will check it. So imagine a cron job that is looking for any page that has "come due" and needs to be spidered, but I don't do anything else except that.
Hope that helps... you might find another thread I wrote up on "Pseudo multithreading with PHP and Apache" which talks about using the Apache server to throw multiple threads via a web request... I like that technique quite a bit as well.
Again, welcome to the Cache.
/perk