[VoiceOps] Any subscribers from the UK?

Alex Balashov abalashov at evaristesys.com
Tue Aug 4 07:00:20 EDT 2009


Peter Beckman wrote:

>> There is a considerable body of evidence suggesting that although PHP 
>> does expose a socket API, using it to do sockets is a terrible idea 
>> because it just doesn't perform well at all.  I don't know why anyone 
>> would write a server - FastAGI or otherwise - in PHP.
> 
>  I haven't done any tests to see how well or badly PHP does sockets

I haven't either;  I suppose there are so many points of view from which 
doing a serious server in PHP is considered preposterous and misguided 
that I couldn't find anyone interested in commissioning a study to 
measure the precise degree to which it is so.

My evidence is anecdotal, and for that reason difficult to relate or 
cite.  I see people trying to do this stuff - for the reasons you 
mention - and I see it 1) falling over and 2) becoming untenably complex 
/ impossible to maintain / experiencing internally degenerative motion 
as a codebase.

>> Besides, PHP does not really have the appropriate low-level dimension 
>> for heavyweight or nuanced system calls;  that's not what it was 
>> designed for. Then again, I suppose people make that argument for 
>> Java, too.
> 
>  Untrue: http://us.php.net/manual/en/intro.sockets.php
> 
>  "The socket extension implements a low-level interface to the socket
>  communication functions based on the popular BSD sockets, providing the
>  possibility to act as a socket server as well as a client."

I was talking about PHP's character as a rather abstract, 
application-level runtime environment, not the ability of the 
interpreter-makers to clunkily expose a low-level system call API 
somehow.  That's done in a lot of languages.

>  PHP is more versatile than many people think.  It's not as deep zen as
>  Perl can be, and there are some frustrating inconsistencies in how PHP
>  operates, but it can be powerful in a knowledgable programmer's hands.

The same can be said of almost any language and runtime environment;  it 
is possible to implement almost anything in a language that has a 
sufficiently broad library, and it is possible to follow better or worse 
architectural and programming practices in ColdFusion and Bash, too.

I do not know that the capabilities technically present in the runtime 
interpreter - which are dictated to a fairly large extent by a 
combination of user demands and the developers' own sense of creativity 
- are really a reflection of PHP's "versatility" paradigmatically.  As I 
said, you can write a VM hypervisor in it if the right system calls and 
API hooks were just available.  I think I once read an article about 
someone that stringed a primitive SSH server out of components all 
defined and invoked inline from a Bash script;  are you moved to say 
that the fact that it can be done is a testament to Bash's immense power 
and versatility in the right hands?

It's a fair statement in that context, to be sure, but is it versatile 
in the sort of way that leads to a viable recommendation as an 
implementational language for an SSH server?  Perhaps the example is 
incommensurable because Bash certainly doesn't make it easier or more 
terse to implement one than in a language like Perl or PHP, but even if 
it did, by code volume, through various improvements to the 
interpreter's capabilities (much as in PHP):  Is that trait the defining 
one, the only thing holding you back from saying, "Let's write our SSH 
server in PHP?"

>  I think that maybe PHP has improved since you last used it (or so it
>  seems).  Again, I'm sure there are better ways, but using PHP for FastAGI
>  is not as bad as you make it seem.  Then again, I'm not doing 1,200,000
>  minutes per day.

I don't know how bad I'm making it seem.  I am not suggesting that it is 
outside the realm of feasibility, especially from a basically functional 
perspective.

>> It's a qualitative issue -- "just because you can, doesn't mean you 
>> should."
> 
>  Maybe, but if you are a small mom-and-pop and just need it to work,
>  reusing already written code for both your web and VoIP applications makes
>  a lot of sense.  And if they do it right, by using a PHP-based FastAGI vs
>  straight AGI(), it can scale fairly well.

It's a fair economic point, although personally, to me, that just says 
that the business logic that is shared between web and VoIP needs to 
reside in a common place that still allows the right approaches to be 
taken on both sides and can be called.  Stored procedures, triggers and 
the like are a common candidate for this in my work;  a database call 
can both figure out which rate center destination a call should be 
routed to from the call router, and calculate that rate center and cost 
dynamically for various UI functionality, for example.  Or, if the 
technical argument is there - stemming from the complexity and real-time 
character of the data needed to make the decisions - perhaps even a real 
middleware layer of some sort.

Seems to me that the code reuse argument goes so far.  Saying that using 
the same technology on both sides of a very large abstraction and 
performance domain divide is the most efficient way to lever existing 
code fails to take into account that maybe you just shouldn't have done 
the business layer in PHP either, or otherwise have put the code in the 
wrong place.

What *are* business layers for something like an ITSP call processing 
platform doing in PHP, anyway  PHP is largely a presentation language. 
To reiterate in the most emphatic terms, that is not a description of 
the capabilities of its (phenomenally large) API - as far as I can tell 
there is little that PHP doesn't technically "have" - but rather a 
judgment about the "sort of thing that it is" or was intended to be, a 
genus.

Bash was intended to be a shell and to provide a scripting environment 
for simple batching of the sort of stuff you'd often do in a shell 
(complete with very rudimentary flow control and data primitives), even 
though you could certainly augment its, er, versatility by hacking in 
more plumbing to the outside (system) world.

Was PHP designed to be a language for standalone scripts and processes? 
  Does much of the work that goes on in PHP exist to further that 
particular aim?  It's pretty convincing from a cursory survey of the way 
PHP is progressing that it is - and always has been - about the web.  It 
seems to me that its use for standalone scripts really is an accident of 
someone deciding it would be nifty to let people run the interpreter 
from the CLI, which I guess is formally required anyway in order to 
allow PHP to run in a CGI-style way (not with mod_php) if that is desired.

>> It is within the realm of conception that you could write a virtual 
>> machine container/hypervisor in PHP, if only the interpreter exposed 
>> the system calls and other primitives you'd need to pull it off.  But 
>> it's not done for a reason--surely you can agree. (Except perhaps for 
>> the novelty/Slashdot factor by someone with far too much time on their 
>> hands.)
> 
>  Given a programmer talented in all languages, absolutely.

It still comes down to the fact that PHP is a very slow layer of 
interpreted fat and high-level abstraction, and furthermore that its 
virtues and strengths - of which there are many - have absolutely zero 
imaginable correlation to the goal of writing a reasonably performing 
hypervisor.  It dimensions well to web applications, not low-level, 
back-end system processes.

We aren't going to agree on this, although I think we largely agree in 
the breadth of the overall context.  The bottom line really comes down 
to what you value in the craft.  The values of the commercial world 
often dictate that you should do something in the simplest and cheapest 
way possible, with no attention paid to the quality, density or 
longevity of the final product nor the erudition that is brought to bear 
on the problem.  To the extent that one shares those values, one can 
PHP-AGI one's way out of this problem, sure.  Actually, with the amount 
of call setups and burst volume objectively required in most 
cottage-industry ITSP operations, you could probably do the whole thing 
in Bash:

    ACCT_ROUTE_VAR=$(echo \
	            "SELECT id, rt FROM rt_tbl WHERE account = $ACCT LIMIT 1" \
                     | mysql -u user --password=blah -D database \
		    | head -n 3 | tail -n 1 | awk -F '|' '{print $2}')

It'll end up on TheDailyWTF.com, but it does work, and will probably 
continue to work for reasonably large "values of n" that the provider 
will experience in the near/foreseeable future.

On the other side, there's considerable value to be reaped in the 
technical excellence of a little overengineering - not excessive, of 
course, there's always a balance to find.  The value is both qualitative 
to those that value the aesthetic dimension of good programmatic 
craftsmanship and economic in that the system can grow to meet your 
needs, including both needs themselves and magnitudes of needs that 
cannot be reasonably anticipated.

If you and I were charged with developing an integrated technology stack 
as a competitor to say, BroadWorks or Metaswitch, and the requirement 
was that it be able to process bursts of, say, 6500 call setups per 
minute, and you used PHP-AGI and I used something that I find to avoid 
the pitfalls of that approach, my implementation would win and yours 
would lose, per given unit of hardware capacity.  That issue is 
completely academic and largely moot because other limitations will be 
encountered long before that becomes a concern, since Asterisk is in 
use.  :-)  Secondly, neither of us is actually building a system that 
has to handle very bulky logic for 100+ CPS--that's considerably more 
than most commercial softswitch gear will reliably do.  But if we were, 
I don't think you'd use PHP.

It is not so much more difficult to use the right tool for the right job 
to begin with;  it's not a night or day issue in terms of capital 
requirements.  Even if you'll never need it, it's nice to know that you 
can rest easy at a lower threshold because you went for the right 
architecture, as opposed to what many of my customers worry about, which 
is that doubling their traffic next year will render their architecture 
completely unusable because it was built with this kind of crap, and is 
already starting to crack.

I don't make my living by selling customers a geostationary satellite 
guidance system when they need a horse--there's plenty of that out 
there, much of it in enterprise-size environments.  I know, I know, 
ITSPs are small companies that have to take the most pragmatic route to 
achieve anything.  But I think that appreciating the long-term benefits 
of good (perhaps even a little excessive) engineering, as opposed to 
just putting out today's fire today, is critical to any field of 
commercial endeavour in technology, regardless.

I realise you don't disagree with me on most of this.  I just think that 
these premises lead to the conclusion that there's no way something like 
PHP can be the ticket, whereas you clearly don't.


>  I like Net::Server::Fork because it allows me to HUP to restart (reload
>  new code) the parent process without touching the child processes, which
>  means I can put new FastAGI code into production without waiting for no
>  calls or worrying about disconnecting existing active calls.  It is also
>  stable and have not had problems with it in years.

Good to know;  I had not considered the soft reload angle.  Thanks!

-- Alex

-- 
Alex Balashov
Evariste Systems
Web    : http://www.evaristesys.com/
Tel    : (+1) (678) 954-0670
Direct : (+1) (678) 954-0671
Mobile : (+1) (678) 237-1775


More information about the VoiceOps mailing list