5 Star 5 Fork 3

qzfzz/php-beanstalk

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
beanstalk.c 58.45 KB
一键复制 编辑 原始数据 按行查看 历史
qzfzz 提交于 8年前 . 解决资源关闭bug
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727
/*
+----------------------------------------------------------------------+
| PHP Version 5 and Version 7 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2015 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Bruce Tsisen |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_beanstalk.h"
#include "Zend/zend_list.h"
#include "Zend/zend_alloc.h"
#include "Zend/zend_hash.h"
#include "Zend/zend_API.h"
#include <string.h>
/* If you declare any globals in php_beanstalk.h uncomment this:
ZEND_DECLARE_MODULE_GLOBALS(beanstalk)
ZEND_DECLARE_MODULE_GLOBALS(beanstalk)
*/
/* True global resources - no need for thread safety here */
#define PHP_DESCRIPTOR_BEANSTALK_RES_NAME "stream"
#define CRLF "\r\n"
#define CRLF_LEN 2
//返回错误
#define RESPONSE_ERR_OUT_OF_MEMORY "OutOfMemory",
#define RESPONSE_ERR_INTERNAL_ERROR "InternalError"
#define RESPONSE_ERR_DRAINING "Draining"
#define RESPONSE_ERR_BAD_FORMAT "BadFormat"
#define RESPONSE_ERR_UNKNOWN_COMMAND "UnknownCommand"
//返回的COMMAND
#define RESPONSE_INSERTED "INSERTED"
#define RESPONSE_BURIED "BURIED"
#define RESPONSE_EXPECTED_CRLF "EXPECTED_CRLF"
#define RESPONSE_JOB_TOO_BIG "JOB_TOO_BIG"
#define RESPONSE_USING "USING"
#define RESPONSE_DEADLINE_SOON "DEADLINE_SOON"
#define RESPONSE_RESERVED "RESERVED"
#define RESPONSE_DELETED "DELETED"
#define RESPONSE_NOT_FOUND "NOT_FOUND"
#define RESPONSE_RELEASED "RELEASED"
#define RESPONSE_WATCHING "WATCHING"
#define RESPONSE_NOT_IGNORED "NOT_IGNORED"
#define RESPONSE_FOUND "FOUND"
#define RESPONSE_KICKED "KICKED"
#define RESPONSE_OK "OK"
#define RESPONSE_TIMED_OUT "TIMED_OUT"
#define RESPONSE_TOUCHED "TOUCHED"
#define RESPONSE_PAUSED "PAUSED"
//返回COMMAND后有内容的
#define RESPONSE_DATA_RESERVED RESPONSE_RESERVED
#define RESPONSE_DATA_FOUND RESPONSE_FOUND
#define RESPONSE_DATA_OK RESPONSE_OK
#define COMMAND_PUT "put"
#define COMMAND_USE "use"
#define COMMAND_RESERVE "reserve"
#define COMMAND_RESERVE_WITH_TIMEOUT "reserve-with-timeout"
#define COMMAND_DELETE "delete"
#define COMMAND_RELEASE "release"
#define COMMAND_BURY "bury"
#define COMMAND_WATCH "watch"
#define COMMAND_IGNORE "ignore"
#define COMMAND_PEEK "peek"
#define COMMAND_PEEK_READY "peek-ready"
#define COMMAND_PEEK_DELAYED "peek-delayed"
#define COMMAND_PEEK_BURIED "peek-buried"
#define COMMAND_KICK "kick"
#define COMMAND_KICK_JOB "kick-job"
#define COMMAND_STATS_JOB "stats-job"
#define COMMAND_STATS_TUBE "stats-tube"
#define COMMAND_STATS "stats"
#define COMMAND_LIST_TUBES "list-tubes"
#define COMMAND_LIST_TUBE_USED "list-tube-used"
#define COMMAND_LIST_TUBES_WATCHED "list-tubes-watched"
#define COMMAND_TOUCH "touch"
#define COMMAND_PAUSE_TUBE "pause-tube"
#define COMMAND_SEPARATOR " "
#define RESPONSE_INT_DATA_WATCHING 1
#define RESPONSE_INT_DATA_KICKED 2
#define RESPONSE_INT_DATA_INSERTED 3
#define RESPONSE_NO_DATA_BURIED 1
#define RESPONSE_NO_DATA_DELETED 2
#define RESPONSE_NO_DATA_KICKED 3
#define RESPONSE_NO_DATA_PAUSED 4
#define RESPONSE_NO_DATA_RELEASED 5
#define RESPONSE_NO_DATA_TOUCHED 6
#define ASK_SERVER 1
#define NOT_ASK_SERVER 0
#define TUBE_RETURN 1
#define TUBE_NOT_RETURN 0
#define RETURN_WATCH_SIZE 1
#define NOT_RETURN_WATCH_SIZE 0
#define RETRY_TIMES 5
#define STR_CONNECTION "connection"
/**
* beanstalk resource
*/
static int le_beanstalk;
static int useTube( php_stream *pStream, char* pStrTube, zval** return_value, zend_bool bList TSRMLS_DC);
static char* explodeString( char* pStr, zval* array );
static void getStatsResponse( php_stream* pStream, char* pCmd, zval** return_value TSRMLS_DC );
static void getResponseComplexData( php_stream* pStream, zval** return_value, char* pCmd TSRMLS_DC );
static void pauseResumeTube( php_stream* pStream, zval** return_value, char* pStrTube, long lDelay TSRMLS_DC );
static int getListTubeResponse( php_stream* pStream, zval** return_value, char* pCmd TSRMLS_DC );
static void getResponseIntData( php_stream* pStream, zval** return_value, char* pCmd, int iType TSRMLS_DC);
static void getResponseWithNoData( php_stream* pStream, zval** return_value, char* pCmd, int iResponseType TSRMLS_DC );
static int getStream( php_stream **pStream, zval *beanstalkObj, INTERNAL_FUNCTION_PARAMETERS );
zend_class_entry *pBeanstalk;
static zend_function_entry beanstalkMethods[] = {
// PHP_ME(Beanstalk, __construct, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
// PHP_ME(Beanstalk, connect, NULL, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
PHP_FALIAS(connect, beanstalk_connect, NULL)
PHP_FALIAS(close, beanstalk_close, NULL)
PHP_FALIAS(put, beanstalk_put, NULL)
PHP_FALIAS(peek, beanstalk_peek, NULL)
PHP_FALIAS(peekReady, beanstalk_peekReady, NULL)
PHP_FALIAS(delete, beanstalk_delete, NULL)
PHP_FALIAS(stats, beanstalk_stats, NULL)
PHP_FALIAS(bury, beanstalk_bury, NULL)
PHP_FALIAS(ignore, beanstalk_ignore, NULL)
PHP_FALIAS(kick, beanstalk_kick, NULL)
PHP_FALIAS(kickJob, beanstalk_kickJob, NULL)
PHP_FALIAS(listTubes, beanstalk_listTubes, NULL)
PHP_FALIAS(listTubesWatched, beanstalk_listTubesWatched, NULL)
PHP_FALIAS(listTubeUsed, beanstalk_listTubeUsed, NULL)
PHP_FALIAS(pauseTube, beanstalk_pauseTube, NULL)
PHP_FALIAS(resumeTube, beanstalk_resumeTube, NULL)
PHP_FALIAS(peekDelayed, beanstalk_peekDelayed, NULL)
PHP_FALIAS(peekBuried, beanstalk_peekBuried, NULL)
PHP_FALIAS(putInTube, beanstalk_putInTube, NULL)
PHP_FALIAS(release, beanstalk_release, NULL)
PHP_FALIAS(reserve, beanstalk_reserve, NULL)
//PHP_FALIAS(beanstalk_reserveFromTube, NULL)
PHP_FALIAS(statsJob, beanstalk_statsJob, NULL)
PHP_FALIAS(statsTube, beanstalk_statsTube, NULL)
PHP_FALIAS(touch, beanstalk_touch, NULL)
PHP_FALIAS(useTube, beanstalk_useTube, NULL)
PHP_FALIAS(watch, beanstalk_watch, NULL)
{ NULL, NULL, NULL }
};
/* {{{ PHP_INI
*/
/* Remove comments and fill if you need to have entries in php.ini
PHP_INI_BEGIN()
STD_PHP_INI_ENTRY("beanstalk.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_beanstalk_globals, beanstalk_globals)
STD_PHP_INI_ENTRY("beanstalk.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_beanstalk_globals, beanstalk_globals)
PHP_INI_END()
*/
/* }}} */
/* Remove the following function when you have successfully modified config.m4
so that your module can be compiled into PHP, it exists only for testing
purposes. */
/* Every user-visible function in PHP should document itself in the source */
/* {{{ proto string confirm_beanstalk_compiled(string arg)
Return a string to confirm that the module is compiled in */
//PHP_FUNCTION(confirm_beanstalk_compiled)
//{
// char *arg = NULL;
// int arg_len, len;
// char *strg;
//
// if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
// return;
// }
//
// len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "beanstalk", arg);
// RETURN_STRINGL(strg, len, 0);
//}
/* }}} */
/* The previous line is meant for vim and emacs, so it can correctly fold and
unfold functions in source code. See the corresponding marks just before
function definition, where the functions purpose is also documented. Please
follow this convention for the convenience of others editing your code.
*/
/**
* __construct( $host, $port )
*/
//PHP_METHOD(Beanstalk,__construct)
//{
// zval *host, *port;
// zend_class_entry *pB = Z_OBJCE_P( getThis());
//
// if( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "|zz!", &host, &port ) == FAILURE )
// {
// php_printf( "Error occur!" );
// RETURN_NULL();
// }
//
// zend_update_property( pB, getThis(), "host", sizeof( "host" ) - 1, host TSRMLS_CC );
// zend_update_property( pB, getThis(), "host", sizeof( "host" ) - 1, host TSRMLS_CC );
//}
/**
* beanstalk_connect( $host = '127.0.0.1', $port = 11300 )
* @param $host
* @param $port
*
* return source id for success false for failure
*/
PHP_FUNCTION(beanstalk_connect)
{
char *host = "127.0.0.1", *transport, *errstr = NULL;
int host_len = sizeof( "127.0.0.1" ) - 1, transport_len, implicit_tcp = 1, errcode = 0;
zval *pB = getThis();
int flags = STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT;
php_stream* pStream = NULL;
#if PHP_API_VERSION < 20151012
int iHostLen = -1;
int options = ENFORCE_SAFE_MODE;
zval* connection;
#else
size_t iHostLen = -1;
int options = 0;
zval connection;
#endif
long lPort = 11300;//default 11300
char* pWBuf = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sl", &host, &iHostLen, &lPort ) == FAILURE) {
RETURN_FALSE;
}
if( iHostLen != host_len )
{
host_len = iHostLen;
}
if(lPort)
{
int implicit_tcp = 1;
if (strstr(host, "://"))
{
implicit_tcp = 0;
}
transport_len = spprintf(&transport, 0, "%s%s:%d",
implicit_tcp ? "tcp://" : "", host, lPort);
}
else
{
transport = host;
transport_len = host_len;
}
pStream = php_stream_xport_create( transport, transport_len,
options, flags,
NULL, NULL, NULL, &errstr, &errcode);
if( errstr )
{
php_error_docref(NULL TSRMLS_CC, E_WARNING, "[%d] %s", errcode, errstr);
efree(errstr);
}
efree( transport );
if( !pStream )
{
RETURN_FALSE;
}
// BEANSTALK_G(gstream) = pStream;
#if PHP_API_VERSION < 20151012
ALLOC_INIT_ZVAL(connection);
ZEND_REGISTER_RESOURCE(connection,pStream,le_beanstalk);
if( !pB )
{
object_init_ex( return_value, pBeanstalk );
add_property_zval( return_value, STR_CONNECTION, connection );
Z_DELREF_P( connection );
}
else
{
add_property_zval( pB, STR_CONNECTION, connection );
Z_DELREF_P( connection );
RETURN_ZVAL( pB, 1, 0 );
}
#else
// RETURN_RES( zend_register_resource( pStream, le_beanstalk ));
ZVAL_RES(&connection, zend_register_resource( pStream, le_beanstalk ) );
if( !pB )
{
object_init_ex( return_value, pBeanstalk );
add_property_zval( return_value, STR_CONNECTION, &connection );
}
else
{
add_property_zval( pB, STR_CONNECTION, &connection );
RETURN_ZVAL( pB, 1, 0 );
}
#endif
}
/**
* beanstalk_close( $resource )
*
* @param resource $resource
*
* return true for success false for failure
*/
PHP_FUNCTION(beanstalk_close)
{
php_stream *pStream;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O", &beanstalkObj, pBeanstalk ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
#if PHP_API_VERSION < 20151012
php_stream_close( pStream );
//zend_list_delete(Z_RESVAL_P(beanstalkObj));
#else
if( !pStream )
{
RETURN_FALSE;
}
php_stream_close( pStream );
//zend_list_close(Z_RES_P(beanstalkObj));
#endif
RETURN_TRUE;
}
/**
* parse data from response like
* FOUND <id> <bytes>\r\n
* <data>\r\n
*/
static void getResponseComplexData(
php_stream* pStream,
zval** return_value,
char* pCmd TSRMLS_DC )
{
char *pResponse = NULL;
char *pRet = NULL;
char *token;
int i = 0;
int jobID;
int iLen = 0;
size_t sRet;
if( !php_stream_write_string( pStream, pCmd ))
{
ZVAL_FALSE( *return_value );
return;
}
if( pResponse = php_stream_gets( pStream, NULL, 0 ) )
{
if( !strncmp( pResponse, RESPONSE_DATA_FOUND, strlen( RESPONSE_DATA_FOUND )) ||
!strncmp( pResponse, RESPONSE_DATA_RESERVED, strlen( RESPONSE_DATA_RESERVED )))
{
token = strtok( pResponse, COMMAND_SEPARATOR );
while( token )
{
if( i == 1 )
{//id
jobID = atoi( token );
}
else if( i == 2 )
{//length
iLen = atoi( token );
sRet = iLen;
pRet = emalloc( sRet + CRLF_LEN );
iLen = 0;
while( iLen < sRet && !php_stream_eof( pStream ))
{
iLen += php_stream_read( pStream, pRet + iLen, sRet - iLen );
}
php_stream_read( pStream, pRet + sRet, CRLF_LEN );
if( strncmp( CRLF, pRet + sRet, CRLF_LEN ))
{
ZVAL_FALSE( *return_value );
efree( pRet );
efree( pResponse );
return;
}
}
++i;
token = strtok( NULL, COMMAND_SEPARATOR );
}
array_init( *return_value );
add_assoc_long( *return_value, "id", jobID );
memset( pRet + sRet, '\0', CRLF_LEN );
#if PHP_API_VERSION < 20151012
add_assoc_string( *return_value, "data", pRet, 1 );
#else
add_assoc_string( *return_value, "data", pRet );
#endif
efree( pRet );
efree( pResponse );
}
else
{
#if PHP_API_VERSION < 20151012
ZVAL_STRING( *return_value, pResponse, 1 );
#else
ZVAL_STRING( *return_value, pResponse );
#endif
efree( pResponse );
}
}
else
{
ZVAL_FALSE(*return_value );
}
}
/**
* beanstalk_peek( $resource, $lJobID )
* @param $resource resource id
* @param $lJodID job id
*
* return false for error string data for success
*/
PHP_FUNCTION(beanstalk_peek)
{
php_stream* pStream = NULL;
long lJobID = -1;
char* pWBuf = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Ol",
&beanstalkObj, pBeanstalk, &lJobID) == FAILURE)
{
php_error_docref( NULL TSRMLS_CC, E_WARNING, "Invalid parameters" );
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lJobID > 0 )
{
spprintf(&pWBuf, 0, COMMAND_PEEK " %d" CRLF, lJobID );
getResponseComplexData( pStream, &return_value, pWBuf TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_peek( $resource, $pStrTube = 'default' )
* @param $resource resource id
* @param $pStrTube tube name
*
* return array data for success others for failure
*/
PHP_FUNCTION(beanstalk_peekReady)
{
php_stream* pStream = NULL;
char* pStrTube = "default";
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
char* pWBuf = NULL;//COMMAND_PEEK_READY CRLF;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|s", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen )
{
spprintf( &pWBuf, 0, COMMAND_USE " %s" CRLF, pStrTube );
if( -1 == useTube( pStream, pWBuf, &return_value, TUBE_NOT_RETURN TSRMLS_CC ))
{
efree( pWBuf );
RETURN_FALSE;
}
efree( pWBuf );
}
spprintf( &pWBuf, 0, COMMAND_PEEK_READY CRLF );
getResponseComplexData( pStream, &return_value, pWBuf TSRMLS_CC );
efree( pWBuf );
}
/**
* beanstalk_delete( $resource, $jobID )
* @param $resource
* @param $jobID
*
* return true for success false for failue
* delete jobid\r\n
*/
PHP_FUNCTION(beanstalk_delete)
{
php_stream* pStream = NULL;
long lJobID = 0;
char* pWBuf;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Ol", &beanstalkObj, pBeanstalk, &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lJobID > 0 )
{
spprintf(&pWBuf, 0, "delete %d\r\n", lJobID );
getResponseWithNoData( pStream, &return_value, pWBuf, RESPONSE_NO_DATA_DELETED TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the second param!");
RETURN_FALSE;
}
}
/**
* beanstalk_put( $beanstalkResource, $strMsg, $iPri = 1024, $iDelay = 0, $iTtr = 60 )
*
* @param resource $beanstalkResource
* @param string $data The job data
* @param int $iPri From 0 (most urgent) to 0xFFFFFFFF (least urgent)
* @param int $iDelay Seconds to wait before job becomes ready
* @param int $iTtr Time To Run: seconds a job can be reserved for
*
* return jobID for success false for failure;
*/
PHP_FUNCTION(beanstalk_put)
{
php_stream* pStream = NULL;
char* pMsgStr = NULL;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
msgLen = 0;
long iPri = 1024;
long iDelay = 0;
long iTtr = 60;
char* pWBuf;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Os|lll",
&beanstalkObj,
pBeanstalk,
&pMsgStr,
&msgLen,
&iPri,
&iDelay,
&iTtr ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"s|lll",
&pMsgStr,
&msgLen,
&iPri,
&iDelay,
&iTtr ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( msgLen )
{
spprintf(&pWBuf, 0, "put %d %d %d %d" CRLF "%s" CRLF, iPri, iDelay, iTtr, msgLen, pMsgStr );
getResponseIntData( pStream, &return_value, pWBuf, RESPONSE_INT_DATA_INSERTED TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the second param!");
RETURN_FALSE;
}
}
/**
* beanstalk_putInTube( $resource, $pStrTube, $strMsg, $lPri, $lDelay, $lTtr )
*
* @param resource $id;
* @param string $tube;
* @param string $message;
* @param long $privilege
* @param long $delay
* @param long $ttr
*
* return job id or false for error
*/
PHP_FUNCTION(beanstalk_putInTube)
{
php_stream* pStream = NULL;
char* pStrMsg = NULL;
char* pStrTube = NULL;
#if PHP_API_VERSION < 20151012
int iTubeLen = 0, msgLen = 0;
#else
size_t iTubeLen = 0, msgLen = 0;
#endif
long lPri = 1024;
long lDelay = 0;
long lTtr = 60;
char* pWBuf;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Oss|lll", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen, &pStrMsg, &msgLen,
&lPri, &lDelay, &lTtr ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|lll", &pStrTube, &iTubeLen, &pStrMsg, &msgLen,
&lPri, &lDelay, &lTtr ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( msgLen > 0 && iTubeLen > 0 )
{
spprintf( &pWBuf, 0, COMMAND_USE " %s" CRLF, pStrTube );
if( -1 == useTube( pStream, pWBuf, &return_value, TUBE_NOT_RETURN TSRMLS_CC ))
{
efree( pWBuf );
RETURN_FALSE;
}
efree( pWBuf );
spprintf(&pWBuf, 0, "put %d %d %d %d" CRLF "%s" CRLF, lPri, lDelay, lTtr, msgLen, pStrMsg );
getResponseIntData( pStream, &return_value, pWBuf, RESPONSE_INT_DATA_INSERTED TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_status( $resource )
* @param $resource
*
* return stats array
*/
PHP_FUNCTION(beanstalk_stats)
{
php_stream* pStream = NULL;
char* pWBuf = COMMAND_STATS CRLF;
zval *beanstalkObj = getThis();
#if PHP_API_VERSION < 20151012
if (!return_value_used)
{
php_printf( "%s\r\n", "the return result is not used, please remove this line from code!" );
return;
}
#else
if (!USED_RET())
{
return;
}
#endif
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O", &beanstalkObj, pBeanstalk ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
getStatsResponse( pStream, pWBuf, &return_value TSRMLS_CC );
}
/**
* beanstalk_statsJob( $resource, $lJobID )
*
* @param $resource
* @param $lJobID
*
* return false for failure job's status array
*/
PHP_FUNCTION(beanstalk_statsJob)
{
php_stream* pStream = NULL;
long lJobID = -1;
zval *beanstalkObj = getThis();
char* pWBuf = NULL;
#if PHP_API_VERSION < 20151012
if (!return_value_used)
{
php_printf( "%s\r\n", "the return result is not used, please remove this line from code!" );
return;
}
#else
if (!USED_RET())
{
return;
}
#endif
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Ol", &beanstalkObj, pBeanstalk, &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lJobID > 0 )
{
spprintf( &pWBuf, 0, "%s %d" CRLF, COMMAND_STATS_JOB, lJobID );
getStatsResponse( pStream, pWBuf, &return_value TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_statsTube( $resource, $pStrTube )
*
* @param $resource
* @param $pStrTube tube name
*
* return tube's status array for success false for failure
*/
PHP_FUNCTION(beanstalk_statsTube)
{
php_stream* pStream = NULL;
zval *beanstalkObj = getThis();
char* pStrTube = NULL;
char* pWBuf = NULL;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
#if PHP_API_VERSION < 20151012
if (!return_value_used)
{
php_printf( "%s\r\n", "the return result is not used, please remove this line from code!" );
return;
}
#else
if (!USED_RET())
{
return;
}
#endif
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Os", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen )
{
spprintf( &pWBuf, 0, COMMAND_STATS_TUBE " %s" CRLF, pStrTube );
getStatsResponse( pStream, pWBuf, &return_value TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* 响应后不带数据如DELETED TOUCHED等
*
* 形如: "TOUCHED\r\n" to indicate success.
*/
static void getResponseWithNoData( php_stream* pStream, zval** return_value, char* pCmd, int iResponseType TSRMLS_DC )
{
char* pRet = NULL;
if( !php_stream_write_string( pStream, pCmd ))
{
ZVAL_FALSE( *return_value );
return;
}
pRet = php_stream_gets( pStream, NULL, 0 );
if( pRet )
{
switch( iResponseType )
{
case RESPONSE_NO_DATA_BURIED:
if( !strncmp( RESPONSE_BURIED, pRet, strlen( RESPONSE_BURIED ) ))
{
efree( pRet );
ZVAL_TRUE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
case RESPONSE_NO_DATA_DELETED:
if( !strncmp( RESPONSE_DELETED, pRet, strlen( RESPONSE_DELETED ) ))
{
efree( pRet );
ZVAL_TRUE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
case RESPONSE_NO_DATA_KICKED:
if( !strncmp( RESPONSE_KICKED, pRet, strlen( RESPONSE_KICKED ) ))
{
efree( pRet );
ZVAL_TRUE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
case RESPONSE_NO_DATA_PAUSED:
if( !strncmp( RESPONSE_PAUSED, pRet, strlen( RESPONSE_PAUSED ) ))
{
efree( pRet );
ZVAL_TRUE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
case RESPONSE_NO_DATA_RELEASED:
if( !strncmp( RESPONSE_RELEASED, pRet, strlen( RESPONSE_RELEASED ) ))
{
efree( pRet );
ZVAL_TRUE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
case RESPONSE_NO_DATA_TOUCHED:
if( !strncmp( RESPONSE_TOUCHED, pRet, strlen( RESPONSE_TOUCHED ) ))
{
efree( pRet );
ZVAL_TRUE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
default:
ZVAL_FALSE( *return_value );
return;
}
ZVAL_FALSE( *return_value );
return;
}
efree( pRet );
ZVAL_FALSE( *return_value );
}
/**
* beanstalk_bury( $resource, $lJobID, $lPri = 1024 )
*
* @param $resource
* @param $lJobID
* @param $lPri = 1024
*
* return false for failure true for success
*/
PHP_FUNCTION(beanstalk_bury)
{
php_stream* pStream = NULL;
char* pWBuf = NULL;
long lJobID = -1;
long lPri = 1024;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Ol|l", &beanstalkObj, pBeanstalk, &lJobID, &lPri ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &lJobID, &lPri ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( -1 != lJobID )
{
spprintf( &pWBuf, 0, COMMAND_BURY " %d %d" CRLF, lJobID, lPri );
getResponseWithNoData( pStream, &return_value, pWBuf, RESPONSE_NO_DATA_BURIED TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_ignore( $resource, $pStrTube )
*
* @param resource $resource
* @param string $pStrTube
*
* return:
* integers for watched size
* false for error
*/
PHP_FUNCTION(beanstalk_ignore)
{
php_stream* pStream = NULL;
char* pStrTube = NULL;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
char* pWBuf = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Os", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen )
{
if( strcmp( pStrTube, "default" ))
{
spprintf( &pWBuf, 0, COMMAND_IGNORE " %s" CRLF, pStrTube );
getResponseIntData( pStream, &return_value, pWBuf, RESPONSE_INT_DATA_WATCHING TSRMLS_CC );
efree( pWBuf );
}
else
{
RETURN_FALSE;
}
}
else
{
RETURN_FALSE;
}
}
/**
* 响应中带整型数据
* 形如: "INSERTED <id>\r\n"
*/
static void getResponseIntData( php_stream* pStream, zval** return_value, char* pCmd, int iResType TSRMLS_DC )
{
size_t sRet;
char* pRes = NULL;
int iRetry = 0;
do
{
if( !php_stream_write_string( pStream, pCmd ))
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"network error occur!");
ZVAL_FALSE( *return_value );
return;
}
pRes = php_stream_get_line( pStream, NULL, 0, &sRet );
if( !strncmp( pRes, RESPONSE_WATCHING, strlen( RESPONSE_WATCHING ) ) ||
!strncmp( pRes, RESPONSE_KICKED, strlen( RESPONSE_KICKED ) ) ||
!strncmp( pRes, RESPONSE_INSERTED, strlen( RESPONSE_INSERTED ) ) )
{
switch( iResType )
{
case RESPONSE_INT_DATA_WATCHING:
ZVAL_LONG( *return_value, atoi( pRes + strlen( RESPONSE_WATCHING ) + 1 ) );
break;
case RESPONSE_INT_DATA_KICKED:
ZVAL_LONG( *return_value, atoi( pRes + strlen( RESPONSE_KICKED ) + 1 ) );
break;
case RESPONSE_INT_DATA_INSERTED:
ZVAL_LONG( *return_value, atoi( pRes + strlen( RESPONSE_INSERTED ) + 1 ) );
break;
default:
efree( pRes );
ZVAL_FALSE( *return_value );
return;
}
efree( pRes );
return;
}
if( pRes )
{
efree( pRes );
pRes = NULL;
}
}
while( ++iRetry < RETRY_TIMES );//retry three times
if( pRes )
{
efree( pRes );
}
ZVAL_FALSE( *return_value );
}
/**
* beanstalk_kick( $resource, $max = 30 )
*
* @param resource $resource
* @param int $max
*
* return false for error others for kicked jobs
*/
PHP_FUNCTION(beanstalk_kick)
{
php_stream* pStream = NULL;
long lMax = 30;
char* pWBuf = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|l", &beanstalkObj, pBeanstalk, &lMax ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &lMax ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lMax <= 0 )
{
lMax = 30;
}
spprintf( &pWBuf, 0, COMMAND_KICK " %d" CRLF, lMax );
getResponseIntData( pStream, &return_value, pWBuf, RESPONSE_INT_DATA_KICKED TSRMLS_CC );
efree( pWBuf );
}
/**
* beanstalk_kickJob( $resource, $lJobID )
*
* @param resource $resource
* @param int $lJobID
*
* return true for success false for error or not found etc.
*/
PHP_FUNCTION(beanstalk_kickJob)
{
php_stream* pStream = NULL;
long lJobID = -1;
char* pWBuf = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Ol", &beanstalkObj, pBeanstalk, &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lJobID )
{
spprintf( &pWBuf, 0, COMMAND_KICK_JOB " %d" CRLF, lJobID );
getResponseWithNoData( pStream, &return_value, pWBuf, RESPONSE_NO_DATA_KICKED TSRMLS_CC );
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* 0 for success
* others for failure
*
* e.g.:OK <bytes>\r\n
* <data>\r\n
*
* this data format is not same as beanstalk_peek ...
*/
static int getListTubeResponse( php_stream* pStream, zval** return_value, char* pCmd TSRMLS_DC )
{
size_t sRet = 0;
char* pResponse = NULL;
size_t iLen = 0;
char *pRet = NULL;
char *token = NULL;
int i = 0;
if( !php_stream_write_string( pStream, pCmd ))
{
return -1;
}
pResponse = php_stream_get_line( pStream, NULL, 0, &sRet );
if( pResponse && strncmp( pResponse, RESPONSE_OK, 2 ))
{
efree( pResponse );
ZVAL_FALSE( *return_value );
return -1;
}
token = strtok( pResponse, COMMAND_SEPARATOR );
while( token )
{
if( i == 1 )
{//id
iLen = atoi( token );
sRet = iLen;
iLen = 0;
pRet = emalloc( sRet + CRLF_LEN );
while( iLen < sRet && !php_stream_eof( pStream ))
{
iLen += php_stream_read( pStream, pRet + iLen, sRet - iLen );
}
php_stream_read( pStream, pRet + sRet, CRLF_LEN );
if( strncmp( pRet + sRet, CRLF, CRLF_LEN ))
{
efree( pResponse );
efree( pRet );
ZVAL_FALSE( *return_value );
return -1;
}
memset( pRet + sRet, '\0', CRLF_LEN );
if( iLen > 0 )
{
array_init( *return_value );
i = 0;
token = strtok( pRet + 2, CRLF );
while( token )
{
if( !i++ )
{
token = strtok( NULL, CRLF );
continue;
}
if( *token != '-' )
{
token = strtok( NULL, CRLF );
continue;
}
#if PHP_API_VERSION < 20151012
add_next_index_stringl( *return_value, token + 2, strlen( token ) - 2, 1 );
#else
add_next_index_stringl( *return_value, token + 2, strlen( token ) - 2 );
#endif
token = strtok( NULL, CRLF );
}
efree( pRet );
pRet = NULL;
}
if( pRet )
{
efree( pRet );
}
efree( pResponse );
pResponse = NULL;
return 0;
}
++i;
token = strtok( NULL, COMMAND_SEPARATOR );
}
if( pResponse )
{
efree( pResponse );
}
ZVAL_FALSE( *return_value );
return -1;
}
/**
* beanstalk_listTubes( $resource )
* @param $resource
*
* return array for success false for failure
*/
PHP_FUNCTION(beanstalk_listTubes)
{
php_stream* pStream = NULL;
char* pWBuf = COMMAND_LIST_TUBES CRLF;
zval *beanstalkObj = getThis();
int iTry = 0;
int iRet = 0;
#if PHP_API_VERSION < 20151012
if (!return_value_used)
{
php_printf( "%s\r\n", "the return result is not used, please remove this line from code!" );
return;
}
#else
if (!USED_RET())
{
return;
}
#endif
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O", &beanstalkObj, pBeanstalk ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
do
{
iRet = getListTubeResponse( pStream, &return_value, pWBuf TSRMLS_CC );
}while( iRet && ++iTry < 3 );
}
/**
* beanstalk_listTubes( $resource )
* @param $resource
*
* return array for success false for failure
*/
PHP_FUNCTION(beanstalk_listTubesWatched)
{
php_stream* pStream = NULL;
zval *beanstalkObj = getThis();
char* pWBuf = COMMAND_LIST_TUBES_WATCHED CRLF;
int iTry = 0;
int iRet = 0;
#if PHP_API_VERSION < 20151012
if (!return_value_used)
{
php_printf( "the result is not used, please remove this line from code!");
return;
}
#else
if (!USED_RET())
{
php_printf( "the result is not used, please remove this line from code!");
return;
}
#endif
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O", &beanstalkObj, pBeanstalk ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
do
{
iRet = getListTubeResponse( pStream, &return_value, pWBuf TSRMLS_CC );
}while( iRet && ++iTry < 3 );
if( iRet )
{
RETURN_FALSE;
}
}
/**
* beanstalk_listTubeUsed( $resource, $bAskServer = false )
* @param $resource
* @param $bAskServer = false
*
* return string or true for success others for failure
*/
PHP_FUNCTION(beanstalk_listTubeUsed)
{
php_stream* pStream = NULL;
zend_bool bAskServer = 0;
char* pWBuf = COMMAND_LIST_TUBE_USED CRLF;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|b", &beanstalkObj, pBeanstalk, &bAskServer ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &bAskServer ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( !bAskServer )
{
#if PHP_API_VERSION < 20151012
RETURN_STRING( "default", 1 );
#else
RETURN_STRING( "default" );
#endif
return;
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
useTube( pStream, pWBuf, &return_value, bAskServer TSRMLS_CC );
}
static void pauseResumeTube( php_stream* pStream, zval** return_value, char* pStrTube, long lDelay TSRMLS_DC )
{
char* pWBuf = NULL;
spprintf( &pWBuf, 0, COMMAND_PAUSE_TUBE " %s %d" CRLF, pStrTube, lDelay );
getResponseWithNoData( pStream, return_value, pWBuf, RESPONSE_NO_DATA_PAUSED TSRMLS_CC );
efree( pWBuf );
}
/**
* beanstalk_pauseTube( $resource, $pStrTube, $lDelay )
*
* @param $resource
* @param $pStrTube tube name
* @param $lDelay delay for pause
*
* return false for failure true for success
*/
PHP_FUNCTION(beanstalk_pauseTube)
{
php_stream* pStream = NULL;
char* pStrTube = NULL;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = -1;
long lDelay = 0;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Osl", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen, &lDelay ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &pStrTube, &iTubeLen, &lDelay ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen > 0 )
{
if( lDelay < 0 )
{
lDelay = 0;
}
pauseResumeTube( pStream, &return_value, pStrTube, lDelay TSRMLS_CC );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_resumeTube( $resource, $pStrTube )
*
* @param $resource
* @param $pStrTube tube name
*
* return false for success true for success
*/
PHP_FUNCTION(beanstalk_resumeTube)
{
php_stream* pStream = NULL;
char* pStrTube = NULL;
size_t iTubeLen = -1;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Os", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen > 0 )
{
pauseResumeTube( pStream, &return_value, pStrTube, 0 TSRMLS_CC );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_peekDelayed( $resource, $pStrTube = 'default')
*
* @param $resource
* @param $pStrTube tube name
*
* return false for error others for success
*/
PHP_FUNCTION(beanstalk_peekDelayed)
{
php_stream* pStream = NULL;
char* pStrTube = "default";
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
char* pWBuf = NULL;//COMMAND_PEEK_DELAYED CRLF;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|s", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen && strncmp( pStrTube, "default", sizeof( "default" ) - 1))
{
spprintf( &pWBuf, 0, COMMAND_USE " %s" CRLF, pStrTube );
if( -1 == useTube( pStream, pWBuf, &return_value, TUBE_NOT_RETURN TSRMLS_CC ))
{
efree( pWBuf );
RETURN_FALSE;
}
efree( pWBuf );
}
spprintf( &pWBuf, 0, COMMAND_PEEK_DELAYED CRLF );
getResponseComplexData( pStream, &return_value, pWBuf TSRMLS_CC );
efree( pWBuf );
}
/**
* beanstalk_peekBuried( $resource, $pStrTube = "default" )
*
* @param $resource
* @param $pStrTube tube name
*
* return false for error others for success
*/
PHP_FUNCTION(beanstalk_peekBuried)
{
php_stream* pStream = NULL;
char* pStrTube = NULL;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
char* pWBuf = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|s", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen && strncmp( pStrTube, "default", sizeof( "default" ) - 1))
{
spprintf( &pWBuf, 0, COMMAND_USE " %s" CRLF, pStrTube );
if( -1 == useTube( pStream, pWBuf, &return_value, TUBE_NOT_RETURN TSRMLS_CC ))
{
efree( pWBuf );
RETURN_FALSE;
}
efree( pWBuf );
}
spprintf( &pWBuf, 0, COMMAND_PEEK_BURIED CRLF );
getResponseComplexData( pStream, &return_value, pWBuf TSRMLS_CC );
efree( pWBuf );
}
/**
* beanstalk_touch( $resource, $jobID )
* @param resource $resource
* @param long $jobID
*
* return
* true for success
* false for the job does not exist or is not reserved by the client.
*/
PHP_FUNCTION(beanstalk_touch)
{
php_stream* pStream = NULL;
long lJobID = 0;
char* pWBuf = NULL;//COMMAND_TOUCH CRLF;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Ol", &beanstalkObj, pBeanstalk, &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &lJobID ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lJobID )
{
spprintf( &pWBuf, 0, COMMAND_TOUCH " %d" CRLF, lJobID );
getResponseWithNoData( pStream, &return_value, pWBuf, RESPONSE_NO_DATA_TOUCHED TSRMLS_CC );
efree( pWBuf );
}
else
{
//for error
RETURN_FALSE;
}
}
/**
* beanstalk_release( $resource, $lJobID, $lPri = 1024, $lDelay = 0 )
*
* @param $resource
* @param $lJobID
* @param $lPri = 1024
* @param $lDelay = 0
*
* return false for error others for true
*/
PHP_FUNCTION(beanstalk_release)
{
php_stream* pStream = NULL;
long lJobID = 0;
long lPri = 1024;
long lDelay = 0;
char* pWBuf = NULL;//COMMAND_TOUCH CRLF;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"Ol|ll", &beanstalkObj, pBeanstalk, &lJobID, &lPri, &lDelay ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|ll",&lJobID, &lPri, &lDelay ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lJobID )
{
spprintf( &pWBuf, 0, COMMAND_RELEASE " %d %d %d" CRLF, lJobID, lPri, lDelay );
getResponseWithNoData( pStream, &return_value, pWBuf, RESPONSE_NO_DATA_RELEASED TSRMLS_CC );
efree( pWBuf );
}
else
{
//for error
RETURN_FALSE;
}
}
/**
* beanstalk_reserve( $rid, $lTimeOut )
*
* @param resource $rid
* @param long $lTimeOut for seconds
*
* return array()
*/
PHP_FUNCTION(beanstalk_reserve)
{
php_stream* pStream = NULL;
long lTimeOut = 0;
char* pWBuf = COMMAND_RESERVE CRLF;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|l", &beanstalkObj, pBeanstalk, &lTimeOut ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &lTimeOut ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( lTimeOut <= 0 )//reserve
{
spprintf(&pWBuf, 0, COMMAND_RESERVE CRLF );
}
else
{
spprintf(&pWBuf, 0, COMMAND_RESERVE_WITH_TIMEOUT " %d" CRLF, lTimeOut );
}
getResponseComplexData( pStream, &return_value, pWBuf TSRMLS_CC);
efree( pWBuf );
}
//PHP_FUNCTION(beanstalk_reserveFromTube)
//{
//}
/**
* beanstalk_useTube( @resource, $pStrTube )
*
* @param $resource
* @param $pStrTube
*
* return false for error others for true
*/
PHP_FUNCTION(beanstalk_useTube)
{//
php_stream* pStream = NULL;
char* pStrTube = NULL;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
char* pWBuf = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|s", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &pStrTube, &iTubeLen ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen > 0 )
{
spprintf( &pWBuf, 0, COMMAND_USE " %s" CRLF, pStrTube );
if( !useTube( pStream, pWBuf, &return_value, TUBE_RETURN TSRMLS_CC ))
{
efree( pWBuf );
return;
}
efree( pWBuf );
}
else
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the params!");
RETURN_FALSE;
}
}
/**
* beanstalk_watch( $resource, $tube = 'default', $bReturnWatchSize = false )
*
* @param resource $resource
* @param string $tube
* @param zend_bool $bWatchSize
*
* return true or watchsize for success false for error
*/
PHP_FUNCTION(beanstalk_watch)
{//
php_stream* pStream = NULL;
char* pStrTube = NULL;
zend_bool bWatchSize = 0;
#if PHP_API_VERSION < 20151012
int
#else
size_t
#endif
iTubeLen = 0;
char* pWBuf = NULL;
int iRetry = 0;
size_t sRet;
char* pRes = NULL;
zval *beanstalkObj = getThis();
if ( beanstalkObj == NULL )
{//po
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"O|sb", &beanstalkObj, pBeanstalk, &pStrTube, &iTubeLen, &bWatchSize ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
else
{//oo
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sb", &pStrTube, &iTubeLen, &bWatchSize ) == FAILURE)
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid parameters");
RETURN_FALSE;
}
}
if( getStream( &pStream, beanstalkObj, INTERNAL_FUNCTION_PARAM_PASSTHRU ) )
{
RETURN_FALSE;
}
if( iTubeLen > 0 )
{
spprintf( &pWBuf, 0, COMMAND_WATCH " %s" CRLF, pStrTube );
}
else
{
if( bWatchSize )
{
spprintf( &pWBuf, 0, COMMAND_WATCH " %s" CRLF, "default" );
}
else
{
RETURN_TRUE;//by default watch default tube
}
}
do
{
if( !php_stream_write_string( pStream, pWBuf ))
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"network error occur!");
RETURN_FALSE;
}
pRes = php_stream_get_line( pStream, NULL, 0, &sRet );
if( !strncmp( pRes, RESPONSE_WATCHING, strlen( RESPONSE_WATCHING ) ))
{
if( bWatchSize )
{
RETVAL_LONG( atoi( pRes + strlen( RESPONSE_WATCHING ) + 1 ) );
efree( pRes );
efree( pWBuf );
return;
}
else
{
efree( pRes );
efree( pWBuf );
RETURN_TRUE;
}
}
efree( pRes );
}
while( ++iRetry < RETRY_TIMES );
efree( pWBuf );
RETURN_FALSE;
};
//PHP_FUNCTION(beanstalk_watchOnly)
//{
//}
/* {{{ php_beanstalk_init_globals
*/
/* Uncomment this function if you have INI entries
static void php_beanstalk_init_globals(zend_beanstalk_globals *beanstalk_globals)
{
beanstalk_globals->global_value = 0;
beanstalk_globals->global_string = NULL;
}
*/
/* }}} */
//static int le_beanstalk_stream;
#if PHP_API_VERSION < 20151012
static void php_beanstalk_phpstream_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
#else
static void php_beanstalk_phpstream_dtor(zend_resource *rsrc )
#endif
{
php_stream *stream = (php_stream*)rsrc->ptr;
if( stream )
php_stream_close( stream );
}
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(beanstalk)
{
zend_class_entry ce;
INIT_CLASS_ENTRY( ce, "Beanstalk", beanstalkMethods );
pBeanstalk = zend_register_internal_class( &ce TSRMLS_CC );
zend_declare_property_string( pBeanstalk, "host", strlen( "host" ), "127.0.0.1", ZEND_ACC_PUBLIC TSRMLS_CC );
zend_declare_property_long( pBeanstalk, "port", strlen( "port" ), 11300, ZEND_ACC_PUBLIC TSRMLS_CC );
//zend_declare_property( pBeanstalk, ZEND_STRL( STR_CONNECTION ), ZEND_ACC_PUBLIC TSRMLS_CC );
le_beanstalk = zend_register_list_destructors_ex( php_beanstalk_phpstream_dtor, NULL, PHP_DESCRIPTOR_BEANSTALK_RES_NAME, module_number );
REGISTER_LONG_CONSTANT("BEANSTALK_TUBE_RETURN", TUBE_RETURN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("BEANSTALK_TUBE_NOT_RETURN", TUBE_NOT_RETURN, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("BEANSTALK_WATCH_SIZE_RETURN", RETURN_WATCH_SIZE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("BEANSTALK_WATCH_SIZE_NOT_RETURN", NOT_RETURN_WATCH_SIZE, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("BEANSTALK_ASK_SERVER", ASK_SERVER, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("BEANSTALK_NOT_ASK_SERVER", NOT_ASK_SERVER, CONST_CS | CONST_PERSISTENT);
//BEANSTALK_G(gstream) = NULL;
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MSHUTDOWN_FUNCTION
*/
PHP_MSHUTDOWN_FUNCTION(beanstalk)
{
/*
* uncomment this line if you have INI entries
*/
// UNREGISTER_INI_ENTRIES();
return SUCCESS;
}
/* }}} */
/* Remove if there's nothing to do at request start */
/* {{{ PHP_RINIT_FUNCTION
*/
PHP_RINIT_FUNCTION(beanstalk)
{
return SUCCESS;
}
/* }}} */
/* Remove if there's nothing to do at request end */
/* {{{ PHP_RSHUTDOWN_FUNCTION
*/
PHP_RSHUTDOWN_FUNCTION(beanstalk)
{
return SUCCESS;
}
/* }}} */
/* {{{ PHP_MINFO_FUNCTION
*/
PHP_MINFO_FUNCTION(beanstalk)
{
php_info_print_table_start();
php_info_print_table_header(2, "beanstalk support", "enabled");
php_info_print_table_row(2, "Version", PHP_BEANSTALK_VERSION);
php_info_print_table_row(2, "Supported php version", SUPPORTED_PHP_VERSION );
php_info_print_table_row(2, "Author", "Bruce Tsisen" );
php_info_print_table_row(2, "Supports", "qzfzz@163.com");
php_info_print_table_end();
/* Remove comments if you have entries in php.ini
DISPLAY_INI_ENTRIES();
*/
}
/**
* @param php_stream *pStream
* @param char* pCmd
*
*
* return
* 0: for success
* 1: for network error
* 2: for response error
*/
static void getStatsResponse( php_stream* pStream, char* pCmd, zval** return_value TSRMLS_DC )
{
size_t sRet = 0;
char *pResponse = NULL;
size_t iLen = 0;
char *pRet = NULL;
char *token = NULL;
int iPos = 0;
char *pPos;
int i = 0;
int iRetry = 0;
BSKeyVal bsKV;
retry:
if( !php_stream_write_string( pStream, pCmd ))
{
// php_error_docref(NULL TSRMLS_CC, E_WARNING,"network error occur!");
ZVAL_FALSE(*return_value);
return;
}
if( pResponse = php_stream_get_line( pStream, NULL, 0, &sRet ) )
{
//retry three times
if( 2 == strlen( pResponse ) && strncmp( pResponse, RESPONSE_DATA_OK, 2 ) && ++iRetry < 4 )
{
efree( pResponse );
pResponse = NULL;
goto retry;
}
if( !strncmp( pResponse, RESPONSE_DATA_OK, 2 ))
{//RESPONSE_DATA_OK
token = strtok( pResponse, COMMAND_SEPARATOR );
while( token )
{
if( i == 1 )
{//id
iLen = atoi( token );
sRet = iLen;
iLen = 0;
pRet = emalloc( sRet + CRLF_LEN );
while( iLen < sRet && !php_stream_eof( pStream ))
{
iLen += php_stream_read( pStream, pRet + iLen, sRet - iLen );
}
php_stream_read( pStream, pRet + sRet, CRLF_LEN );
if( strncmp( CRLF, pRet + sRet, CRLF_LEN ))
{
efree( pRet );
efree( pResponse );
ZVAL_FALSE( *return_value );
return;
}
break;
}
++i;
token = strtok( NULL, COMMAND_SEPARATOR );
}
memset( pRet + sRet, '\0', CRLF_LEN );
array_init( *return_value );
token = strtok( pRet, "\r\n" );
i = 0;
while( token )
{
if( i++ == 0 )
{
token = strtok( NULL, "\r\n" );
continue;
}
bsKV.key.pStr = token;
pPos = strchr( token, ':' );
if( pPos )
{
iPos = pPos - token;
bsKV.key.iLen = iPos + 1;
}
bsKV.value.pStr = token + iPos + 2;
bsKV.value.iLen = strlen( token ) - iPos - 1;
#if PHP_API_VERSION < 20151012
add_assoc_stringl_ex( *return_value, bsKV.key.pStr, bsKV.key.iLen, bsKV.value.pStr, bsKV.value.iLen, 1 );
#else
add_assoc_stringl_ex( *return_value, bsKV.key.pStr, bsKV.key.iLen, bsKV.value.pStr, bsKV.value.iLen );
#endif
token = strtok( NULL, "\r\n" );
}
if( pRet )
{
efree( pRet );
pRet = NULL;
}
efree( pResponse );
pResponse = NULL;
return;
}
if( pRet )
{
efree( pRet );
}
if( pResponse )
{
efree( pResponse );
pResponse = NULL;
}
}
else
{
if( ++iRetry < RETRY_TIMES )
{
goto retry;
}
// for error
ZVAL_FALSE(*return_value);
return;
}
}
/**
* get php_stream
*/
static int getStream( php_stream **pStream, zval *beanstalkObj, INTERNAL_FUNCTION_PARAMETERS )
{//INTERNAL_FUNCTION_PARAM_PASSTHRU
zval *resource;
#if PHP_API_VERSION < 20151012
zend_class_entry *ceBeanstalk = Z_OBJCE_P( beanstalkObj );
resource = zend_read_property( ceBeanstalk, beanstalkObj, ZEND_STRL( STR_CONNECTION ), 0 TSRMLS_CC );
#else
resource = zend_read_property( pBeanstalk, beanstalkObj, ZEND_STRL( STR_CONNECTION ), 0, NULL);
#endif
if( resource )
{
#if PHP_API_VERSION < 20151012
ZEND_FETCH_RESOURCE_NO_RETURN( *pStream, php_stream*, &resource, -1, PHP_DESCRIPTOR_BEANSTALK_RES_NAME, le_beanstalk );
if( !*pStream )
{
php_error_docref(NULL TSRMLS_CC, E_WARNING,"Invalid param provided, check the first param!");
ZVAL_FALSE( return_value );
return -1;
}
#else
if( !(*pStream = (php_stream*)zend_fetch_resource(Z_RES_P(resource), PHP_DESCRIPTOR_BEANSTALK_RES_NAME, le_beanstalk)))
{
ZVAL_FALSE( return_value );
return -1;
}
#endif
return 0;
}
return -1;
}
/**
* return 0 for success -1 for failure
*/
static int useTube( php_stream *pStream, char* pCmd, zval** return_value, zend_bool bList TSRMLS_DC )
{
int i = 0;
size_t sRet = 0;
char* pRes = NULL;
do
{
if( !php_stream_write_string( pStream, pCmd ))
{
php_printf( "error\r\n" );
ZVAL_FALSE( *return_value );
return -1;
}
pRes = php_stream_get_line( pStream, NULL, 0, &sRet );
if( !strncmp( pRes, RESPONSE_USING, strlen( RESPONSE_USING ) ))
{
if( bList )
{
#if PHP_API_VERSION < 20151012
ZVAL_STRINGL( *return_value, pRes + strlen( RESPONSE_USING ) + 1, sRet - strlen( RESPONSE_USING ) - 3, 1 );
#else
ZVAL_STRINGL( *return_value, pRes + strlen( RESPONSE_USING ) + 1, sRet - strlen( RESPONSE_USING ) - 3 );
#endif
}
else
{
ZVAL_TRUE( *return_value );
}
efree( pRes );
return 0;
}
else if( ++i < RETRY_TIMES )
{
--i;
continue;
}
if( pRes )
{
efree( pRes );
}
}
while( ++i < RETRY_TIMES );//retry three times
ZVAL_FALSE( *return_value );
return -1;
}
/* }}} */
/* {{{ beanstalk_functions[]
*
* Every user visible function must have an entry in beanstalk_functions[].
*/
const zend_function_entry beanstalk_functions[] = {
PHP_FE(beanstalk_connect, NULL)
PHP_FE(beanstalk_close, NULL)
PHP_FE(beanstalk_put, NULL)
PHP_FE(beanstalk_peekReady, NULL)
PHP_FE(beanstalk_peek, NULL)
PHP_FE(beanstalk_delete, NULL)
PHP_FE(beanstalk_stats, NULL)
PHP_FE(beanstalk_bury, NULL)
PHP_FE(beanstalk_ignore, NULL)
PHP_FE(beanstalk_kick, NULL)
PHP_FE(beanstalk_kickJob, NULL)
PHP_FE(beanstalk_listTubes, NULL)
PHP_FE(beanstalk_listTubesWatched, NULL)
PHP_FE(beanstalk_listTubeUsed, NULL)
PHP_FE(beanstalk_pauseTube, NULL)
PHP_FE(beanstalk_resumeTube, NULL)
PHP_FE(beanstalk_peekDelayed, NULL)
PHP_FE(beanstalk_peekBuried, NULL)
PHP_FE(beanstalk_putInTube, NULL)
PHP_FE(beanstalk_release, NULL)
PHP_FE(beanstalk_reserve, NULL)
//PHP_FE(beanstalk_reserveFromTube, NULL)
PHP_FE(beanstalk_statsJob, NULL)
PHP_FE(beanstalk_statsTube, NULL)
PHP_FE(beanstalk_touch, NULL)
PHP_FE(beanstalk_useTube, NULL)
PHP_FE(beanstalk_watch, NULL)
//PHP_FE(beanstalk_watchOnly, NULL)
PHP_FE_END /* Must be the last line in beanstalk_functions[] */
};
/* }}} */
/* {{{ beanstalk_module_entry
*/
zend_module_entry beanstalk_module_entry = {
STANDARD_MODULE_HEADER,
"beanstalk",
beanstalk_functions,
PHP_MINIT(beanstalk),
PHP_MSHUTDOWN(beanstalk),
PHP_RINIT(beanstalk), /* Replace with NULL if there's nothing to do at request start */
PHP_RSHUTDOWN(beanstalk), /* Replace with NULL if there's nothing to do at request end */
PHP_MINFO(beanstalk),
PHP_BEANSTALK_VERSION,
STANDARD_MODULE_PROPERTIES
};
/* }}} */
#ifdef COMPILE_DL_BEANSTALK
ZEND_GET_MODULE(beanstalk)
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
*/
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/qzfzz/php-beanstalk.git
git@gitee.com:qzfzz/php-beanstalk.git
qzfzz
php-beanstalk
php-beanstalk
master

搜索帮助