Обсуждение: Pqsocket not implemented in PHP

Поиск
Список
Период
Сортировка

Pqsocket not implemented in PHP

От
"Nick Stone"
Дата:
Hi,

I tried this question on the PHP lists but didn't get anywhere so I'm hoping
you maybe able to help.

I'm currently implementing a standalone app using php cli. Part of the app
connects to Postgres and waits for a notification using the "Listen
<tablename>" SQL. In the postgres C lib there is a function called
"Pqsocket" which returns the file-descriptor of the socket connection to
Postgres. With this I can use a simple select server to sleep on this
interface and others in the application.

Does anybody now of a patch to make this available under PHP or does the
structure of PHP code effectively make this type approach impossible?
Alternatively if I've just missed the function would somebody point me in
the right direction - I was kind of hoping (until I read the man pages more
closely) that pg_port was the function that wrapped the Pqsocket command but
sadly not!

If I need to wite one then I'll do that and post it back if that's useful
but just in case somebody has done it before...

Thanks

Nick



Re: Pqsocket not implemented in PHP

От
Volkan YAZICI
Дата:
Hi,

On 6/30/05, Nick Stone <nick@harelane.com> wrote:
> I'm currently implementing a standalone app using php cli. Part of the app
> connects to Postgres and waits for a notification using the "Listen
> <tablename>" SQL. In the postgres C lib there is a function called
> "Pqsocket" which returns the file-descriptor of the socket connection to
> Postgres. With this I can use a simple select server to sleep on this
> interface and others in the application.
>
> Does anybody now of a patch to make this available under PHP or does the
> structure of PHP code effectively make this type approach impossible?

You can write a very simple patch returns socket FD using PQsocket().
But, AFAIC, it's not as simple as it seems to listen a socket using
just its FD value. As I understand from the source code, resource
required by socket_open() function has its own internal struct
representation, which means you need to be familiar with PHP internal
data types and mechanism before writing a patch. Therefore, it's not
impossible to implement such a feature, but, to be honest, it needs a
hard work.

IMHO, you can enter a loop with pg_last_notice() by using usleep(). I
won't think it'd cost so much system resource for you.

Regards.

Re: Pqsocket not implemented in PHP

От
"Nick Stone"
Дата:
Hi,

Thanks for the response - though I'm a bit confused the FD is all that is
required for the select call - so I think what you're saying is that the
postgres socket open mechanism isn't the same in php as the postgres C
development library.

I say this because I've implemented this exact mechanism in C++ before
without problem so I'm really not quite following - sorry. Is it that PHP
implements the underlying socket mechanism in a different way? I guess I'm
not quite understanding could you give me a few more details of the PHP
mechanism.

Many thanks

Nick

-----Original Message-----
From: pgsql-php-owner@postgresql.org [mailto:pgsql-php-owner@postgresql.org]
On Behalf Of Volkan YAZICI
Sent: 30 June 2005 11:11
To: Nick Stone
Cc: pgsql-php@postgresql.org
Subject: Re: [PHP] Pqsocket not implemented in PHP

Hi,

On 6/30/05, Nick Stone <nick@harelane.com> wrote:
> I'm currently implementing a standalone app using php cli. Part of the
> app connects to Postgres and waits for a notification using the
> "Listen <tablename>" SQL. In the postgres C lib there is a function
> called "Pqsocket" which returns the file-descriptor of the socket
> connection to Postgres. With this I can use a simple select server to
> sleep on this interface and others in the application.
>
> Does anybody now of a patch to make this available under PHP or does
> the structure of PHP code effectively make this type approach impossible?

You can write a very simple patch returns socket FD using PQsocket().
But, AFAIC, it's not as simple as it seems to listen a socket using just its
FD value. As I understand from the source code, resource required by
socket_open() function has its own internal struct representation, which
means you need to be familiar with PHP internal data types and mechanism
before writing a patch. Therefore, it's not impossible to implement such a
feature, but, to be honest, it needs a hard work.

IMHO, you can enter a loop with pg_last_notice() by using usleep(). I won't
think it'd cost so much system resource for you.

Regards.

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend




Re: Pqsocket not implemented in PHP

От
Volkan YAZICI
Дата:
Hi,

On 6/30/05, Nick Stone <nick@harelane.com> wrote:
> I'm a bit confused the FD is all that is
> required for the select call - so I think what you're saying is that the
> postgres socket open mechanism isn't the same in php as the postgres C
> development library.

No. PHP has an internal struct type to record `resource's. (As you
know, resources are data sources for other functions and they're
specific to PHP.) Therefore, it's not just passing PQsocket() value to
select() function. I'm not very experienced in the PHP internals, but
AFAIC, you need to store socket FD in a specific struct and use other
Zend API calls to proccess 'em.

To sum up, I'd advice you to take a look at ext/socket/socket.c in PHP
source code for a better point of view.

> I say this because I've implemented this exact mechanism in C++ before
> without problem so I'm really not quite following - sorry.

In C++, you just passed PQsocket() value to select() condition. But in
PHP it's not as easy as this. You need to store PQsocket() value in a
specific struct. Let me explain this in PHP way:

When we look at socket_create() function:
  resource socket_create ( int domain, int type, int protocol )
socket_create() doesn't return an `int' for socket FD, it returns a
socket `resource'. That's what I try to mean with "PHP's internal data
source representation".

Regards.

Re: Pqsocket not implemented in PHP

От
"Nick Stone"
Дата:
Ok that's fair enough - I was concerned that the internal structure of PHP
might be a stumbling block - also since nearly every other function was
implemented I suspected there had to be a good reason why that's not been. I
can easily write the code a different way.

Thanks for your help

Nick

-----Original Message-----
From: pgsql-php-owner@postgresql.org [mailto:pgsql-php-owner@postgresql.org]
On Behalf Of Volkan YAZICI
Sent: 30 June 2005 12:38
To: Nick Stone
Cc: pgsql-php@postgresql.org
Subject: Re: [PHP] Pqsocket not implemented in PHP

Hi,

On 6/30/05, Nick Stone <nick@harelane.com> wrote:
> I'm a bit confused the FD is all that is required for the select call
> - so I think what you're saying is that the postgres socket open
> mechanism isn't the same in php as the postgres C development library.

No. PHP has an internal struct type to record `resource's. (As you know,
resources are data sources for other functions and they're specific to PHP.)
Therefore, it's not just passing PQsocket() value to
select() function. I'm not very experienced in the PHP internals, but AFAIC,
you need to store socket FD in a specific struct and use other Zend API
calls to proccess 'em.

To sum up, I'd advice you to take a look at ext/socket/socket.c in PHP
source code for a better point of view.

> I say this because I've implemented this exact mechanism in C++ before
> without problem so I'm really not quite following - sorry.

In C++, you just passed PQsocket() value to select() condition. But in PHP
it's not as easy as this. You need to store PQsocket() value in a specific
struct. Let me explain this in PHP way:

When we look at socket_create() function:
  resource socket_create ( int domain, int type, int protocol )
socket_create() doesn't return an `int' for socket FD, it returns a socket
`resource'. That's what I try to mean with "PHP's internal data source
representation".

Regards.

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend