package.xml0000644000076500000240000022714214553444053012761 0ustar lstrojnystaff amqp pecl.php.net Communicate with any AMQP compliant server This extension can communicate with any AMQP spec 0-9-1 compatible server, such as RabbitMQ, OpenAMQP and Qpid, giving you the ability to create and delete exchanges and queues, as well as publish to any exchange and consume from any queue. Lars Strojny lstrojny lstrojny@php.net yes Pieter de Zwart pdezwart pdezwart@php.net no Bogdan Padalko pinepain pinepain@gmail.com yes 2024-01-22 2.1.2 2.1.2 stable stable PHP License - Fix missing debug symbols for memory checks (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/531) - Fix nullability issue in AMQPBasicProperties (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/532) - Ignore setfacl errors (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/5548760) - Only restart on failure (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/a37c5f1) - Bump actions/checkout from 4.1.0 to 4.1.1 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/506) - Bump awalsh128/cache-apt-pkgs-action from 1.3.0 to 1.3.1 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/509) - Bump fkirc/skip-duplicate-actions from 5.3.0 to 5.3.1 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/507) - Bump phpstan/phpdoc-parser from 1.24.2 to 1.24.3 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/513) - Bump phpstan/phpdoc-parser from 1.24.3 to 1.24.4 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/516) - Bump phpstan/phpdoc-parser from 1.24.4 to 1.24.5 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/521) - Bump phpstan/phpdoc-parser from 1.24.5 to 1.25.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/524) - Bump shivammathur/setup-php from 2.26.0 to 2.27.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/510) - Bump shivammathur/setup-php from 2.27.0 to 2.27.1 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/512) - Bump shivammathur/setup-php from 2.27.1 to 2.28.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/515) - Bump shivammathur/setup-php from 2.28.0 to 2.29.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/528) - Bump squizlabs/php_codesniffer from 3.7.2 to 3.8.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/520) - Bump squizlabs/php_codesniffer from 3.8.0 to 3.8.1 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/527) - Bump symplify/easy-coding-standard from 12.0.11 to 12.0.13 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/519) - Bump symplify/easy-coding-standard from 12.0.13 to 12.1.3 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/526) - Bump symplify/easy-coding-standard from 12.0.8 to 12.0.9 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/517) - Bump symplify/easy-coding-standard from 12.0.9 to 12.0.11 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/518) - Bump symplify/easy-coding-standard from 12.1.3 to 12.1.7 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/529) - Bump symplify/easy-coding-standard from 12.1.7 to 12.1.8 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/530) For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v2.1.1...v2.1.2 7.4.0 1.4.0 amqp 2023-09-07 2.1.0 2.1.0 stable stable PHP License - AMQPValue interface for custom value objects (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/473) - Implement AMQPQueue::recover() to provide the basic.recover method (fixes #478) (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/484) - Fix double free when an error occurs in AMQPQueue::consume() (Jan Prachar <jan.prachar@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/482) - Revamp error handling (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/485) - Refactor AMQPQueue::consume error handling (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/483) - Use RETURN_THROWS for parameter parsing errors (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/474) - Fix auto-formatting (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/877b2f4) - Remove appveyor badge (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/4971c80) - Replace microtime() as a randomness source (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/4503e53) - Fix version test for release builds (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/00a6715) - Remove non-ASCII characters from package.xml to work around pecl.php.net issue (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/732f7e8) - Bump actions/checkout from 3.5.3 to 3.6.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/475) - Bump symplify/easy-coding-standard from 12.0.6 to 12.0.7 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/472) - Bump actions/checkout from 3.5.3 to 3.6.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/471) - Bump actions/checkout from 3.6.0 to 4.0.0 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/481) For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v2.0.0...v2.1.0 2023-08-20 2.0.0 2.0.0 stable stable PHP License Notable changes: - Fix various API oddities, see https://github.com/php-amqp/php-amqp/tree/v2.0.0/UPGRADING.md for details - Remove support for PHP 5 - Various bug fixes (!) Most use-cases should not require much changes from 1.x but check out https://github.com/php-amqp/php-amqp/tree/v2.0.0/UPGRADING.md for a detailed upgrade guide All changes (chronologically): - CentOS development environment (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/467) - Ubuntu development containers (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/466) - Test against upcoming PHP 8.3 (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/465) - Make test host configurable (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/464) - Cosmetics on type functions (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/350202f) - Configurable serialization/deserialization depth (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/463) - Allow bitmask flags arguments to be nullable where previously AMQP_NOPARAM/zero was required (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/462) - Fix generated commit URLs in changelogs (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/commit/4ee6159) - Handle nested AMQP value serialization/deserialization (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/461) - Document lack of reliability of AMQPConnection::isConnected (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/306) - Prevent reuse of channel ID of broken channels (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/460) - Gracefully handle zero as a heartbeat value (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/459) - Build with the clang compiler on CI (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/457) - Include stdint.h for PHP >= 8.0 on Windows (Jan Ehrhardt) (https://github.com/php-amqp/php-amqp/issues/456) - Fix segfault in setPort (Remi Collet <remi@remirepo.net>) (https://github.com/php-amqp/php-amqp/issues/455) - Document BC changes (Lars Strojny <lars@strojny.net>) - Document pseudo-bool method changes (Lars Strojny <lars@strojny.net>) - Fix mangled header on MacOS (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/60) - Validate argument parsing, add AMQPExchange::removeArgument() and AMQPQueue::removeArgument() (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/452) - Skip SSL tests if certificates are missing (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/450) - Check coding style and formatting of stub files (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/447) - Parallelize test execution (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/444) - Deterministic configuration for PHP CLI (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/443) - Fix tag creation during release management (Lars Strojny <lars@strojny.net>) - Move test-report.sh into infra (Lars Strojny <lars@strojny.net>) - The big fat API renovation (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/437) - Handle alpha/beta stability correctly (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/5546436) - Expose better version information (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/438) - Auto-format the codebase (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/436) - More consistent return types for AMQPEnvelope (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/435) - Update stubs (Lars Strojny <lars@strojny.net>) - Fix parameter error handling in AMQPConnection and AMQPChannel (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/434) - Increase credentials and identifier limits (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/433) - Reliably clear consumer tag on AMQPQueue::cancel (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/432) - Ignore failures on experimental builds (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/25) - Update branch name (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/7) - Bump shivammathur/setup-php from 2.25.3 to 2.25.4 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/431) - PHP 8.2 refactorings (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/430) - Fix php version check for static building (Misha Kulakovsky <m@klkvsk.ru>) (https://github.com/php-amqp/php-amqp/issues/425) - Fix stub exception class (closes #427) (Lars Strojny <lars@strojny.net>) - Document custom connection name in stubs (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/700000) - Expose Delivery Mode through constants (Flavio Heleno <flaviohbatista@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/420) - Fix deprecation issue in PHP 8.1 for $consumerTag argument to AMQPQueue::consume() method (Liviu-Ionut Iosif) (https://github.com/php-amqp/php-amqp/issues/421) - Fix: Deprecated: Creation of dynamic property (8.2) (Remi Collet <remi@remirepo.net>) (https://github.com/php-amqp/php-amqp/issues/418) - Fix AMQPEnvelope::getDeliveryTag() return type (Flavio Heleno <flaviohbatista@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/415) - Fix ack/nack/reject param documentation (Flavio Heleno <flaviohbatista@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/414) - Mention time units in all timeout-related methods (Andrii Dembitskyi <andrew.dembitskiy@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/410) For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v1.11.0...v2.0.0 2023-08-15 2.0.0RC1 2.0.0RC1 beta beta PHP License - Handle nested AMQP value serialization/deserialization (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/461) - Document lack of reliability of AMQPConnection::isConnected (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/306) - Prevent reuse of channel ID of broken channels (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/460) - Gracefully handle zero as a heartbeat value (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/459) - Build with the clang compiler on CI (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/457) For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v2.0.0beta2...v2.0.0RC1 2023-08-03 2.0.0beta2 2.0.0beta2 beta beta PHP License - Include stdint.h for PHP >= 8.0 on Windows (Jan Ehrhardt) (https://github.com/php-amqp/php-amqp/issues/456) - Fix segfault in setPort (Remi Collet <remi@remirepo.net>) (https://github.com/php-amqp/php-amqp/issues/455) (!) Check out https://github.com/php-amqp/php-amqp/tree/latest/UPGRADING.md for backward incompatible changes For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v2.0.0beta1...v2.0.0beta2 2023-08-02 2.0.0beta1 2.0.0beta1 beta beta PHP License - Document BC changes (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/0) - Document pseudo-bool method changes (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/0) - Fix mangled header on MacOS (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/60) - Validate argument parsing, add AMQPExchange::removeArgument() and AMQPQueue::removeArgument() (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/452) - Skip SSL tests if certificates are missing (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/450) - Bump shivammathur/setup-php from 2.25.4 to 2.25.5 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/449) - Check coding style and formatting of stub files (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/447) - Parallelize test execution (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/444) - Deterministic configuration for PHP CLI (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/443) - Fix tag creation during release management (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/0) - Move test-report.sh into infra (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/0) (!) Check out https://github.com/php-amqp/php-amqp/tree/latest/UPGRADING.md for backward incompatible changes For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v2.0.0alpha2...v2.0.0beta1 2023-07-29 2.0.0alpha1 2.0.0alpha1 alpha alpha PHP License - The big fat API renovation (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/437) - Handle alpha/beta stability correctly (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/5546436) - Expose better version information (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/438) - Auto-format the codebase (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/436) - More consistent return types for AMQPEnvelope (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/435) - Update stubs (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/0) - Fix parameter error handling in AMQPConnection and AMQPChannel (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/434) - Increase credentials and identifier limits (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/433) - Reliably clear consumer tag on AMQPQueue::cancel (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/432) - Ignore failures on experimental builds (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/25) - Update branch name (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/7) - Bump shivammathur/setup-php from 2.25.3 to 2.25.4 (dependabot[bot]) (https://github.com/php-amqp/php-amqp/issues/431) - PHP 8.2 refactorings (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/430) - Fix php version check for static building (Misha Kulakovsky <m@klkvsk.ru>) (https://github.com/php-amqp/php-amqp/issues/425) - Fix stub exception class (closes #427) (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/0) - Document custom connection name in stubs (Lars Strojny <lars@strojny.net>) (https://github.com/php-amqp/php-amqp/issues/700000) - Expose Delivery Mode through constants (Flavio Heleno <flaviohbatista@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/420) - Fix deprecation issue in PHP 8.1 for $consumerTag argument to AMQPQueue::consume() method (Liviu-Ionut Iosif) (https://github.com/php-amqp/php-amqp/issues/421) - Fix: Deprecated: Creation of dynamic property (8.2) (Remi Collet <remi@remirepo.net>) (https://github.com/php-amqp/php-amqp/issues/418) - Fix AMQPEnvelope::getDeliveryTag() return type (Flavio Heleno <flaviohbatista@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/415) - Fix ack/nack/reject param documentation (Flavio Heleno <flaviohbatista@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/414) - Mention time units in all timeout-related methods (Andrii Dembitskyi <andrew.dembitskiy@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/410) For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v1.11.0...v2.0.0alpha1 2021-12-01 1.11.0 1.11.0 stable stable PHP License - PHP 8.1 compatibility (Lars Strojny <lars.strojny@internations.org>) (https://github.com/php-amqp/php-amqp/issues/405) - Install RabbitMQ from tarball instead of git to improve speed (Michele Locati <michele@locati.it>) (https://github.com/php-amqp/php-amqp/issues/392) - Improve release tooling (Lars Strojny <lars.strojny@internations.org>) For a complete list of changes see: https://github.com/php-amqp/php-amqp/compare/v1.11.0RC1...v1.11.0 2021-11-02 1.11.0RC1 1.11.0RC1 beta beta PHP License - PHP 8 support for Windows (Jan Ehrhardt <github@ehrhardt.nl>) (https://github.com/php-amqp/php-amqp/issues/396) - Add installation instructions for Windows (Marcos Rezende <rezehnde@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/394) - Fixes AMQPConnection Stub typo (Gregoire Pineau <lyrixx@lyrixx.info>) (https://github.com/php-amqp/php-amqp/issues/401) - Fix AMQPQueue stub (Gocha Ossinkine <ossinkine@ya.ru>) (https://github.com/php-amqp/php-amqp/issues/404) - SetReadTimeout accepts float param (Andrii Dembitskyi <andrew.dembitskiy@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/388) - Move from Travis CI to Github Actions (Vadim Borodavko <vadim.borodavko@gmail.com>) (https://github.com/php-amqp/php-amqp/issues/391) - Release tooling: handle RC stability properly (Lars Strojny <lars.strojny@internations.org>) (https://github.com/php-amqp/php-amqp/issues/71) - More robust release tooling (Lars Strojny <lars.strojny@internations.org>) (https://github.com/php-amqp/php-amqp/issues/0)For a complete list of changes see:https://github.com/php-amqp/php-amqp/compare/v1.11.0beta...v1.11.0RC1 2020-04-05 1.10.2 1.10.2 stable stable PHP License - Windows build: avoid variable lengths arrays (Christoph M. Becker) (https://github.com/pdezwart/php-amqp/issues/368)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.10.1...v1.10.2 2020-04-05 1.10.1 1.10.1 stable stable PHP License - Fix Windows compatibility: avoid variable lengths arrays (Christoph M. Becker <cmbecker69@gmx.de>) (https://github.com/pdezwart/php-amqp/issues/368)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.10.0...v1.10.1 2020-04-03 1.10.0 1.3.0 stable stable PHP License - Adding global prefetch support (#366) (Terence Marks <tezmarks@gmail.com>) (https://github.com/pdezwart/php-amqp/issues/367) - Fix minimal librabbitmq in config.m4 and readme (Remi Collet <remi@remirepo.net>) (https://github.com/pdezwart/php-amqp/issues/347) - Support connection_name parameter for custom connection names in RabbitMQ (Alexandr Zolotukhin <supersmile2009@gmail.com>) (https://github.com/pdezwart/php-amqp/issues/363) - Fixed build on Travis CI (Alexandr Zolotukhin <supersmile2009@gmail.com>) (https://github.com/pdezwart/php-amqp/issues/365) - Make use of rpc_timeout in newer librabbitmq by introducing new constructor hash parameter (modulatix <oleg.pereverzev@gmail.com>) (https://github.com/pdezwart/php-amqp/issues/334) - Fix #355: Compile failure on php 7.4 (Christoph M. Becker <cmbecker69@gmx.de>) (https://github.com/pdezwart/php-amqp/issues/359) - Update amqp_type.c (Pawel Mikolajczuk <pawel@mikolajczuk.in>) (https://github.com/pdezwart/php-amqp/issues/360) - Build against PHP 7.4 (Carlos Barrero <carlos.barrero@spotahome.com>) (https://github.com/pdezwart/php-amqp/issues/361) - Pass params by value in AMQPConnection::__construct() (Sergei Karpov) (https://github.com/pdezwart/php-amqp/issues/346) - Fix explicit null-string for $routing_key in Queue::bind() and Exchange::publish() (Sergei Karpov) (https://github.com/pdezwart/php-amqp/issues/341) - No longer limited to PHP 5 (Lars Strojny <lars.strojny@internations.org>) (https://github.com/pdezwart/php-amqp/issues/0) - Fix minimal version to 5.6 (Remi Collet <remi@famillecollet.com>) (https://github.com/pdezwart/php-amqp/issues/338) - Back to dev (Lars Strojny <lars.strojny@internations.org>) (https://github.com/pdezwart/php-amqp/issues/1)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.9.4...v1.10.0 2017-10-19 1.9.4 1.3.0 stable stable PHP License * Improved build environment (Olivier Dolbeau) * Various bug fixes and improvements (Bogdan Padalko, yjqg6666) * Support for PHP 7.3 (Remi Collet)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.9.3...v1.9.4 2017-10-19 1.9.3 1.3.0 stable stable PHP License * Fix handling channel consumers (#284) (Bogdan Padalko) * Add support for consumer tags (#282) (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.9.1...v1.9.3 1.9.1 1.3.0 stable stable PHP License * Separate queue and exchange args to prevent segfault with opcache enabled (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.9.0...v1.9.1 1.9.0 1.3.0 stable stable PHP License * AMQP types are now better supported through value objects (see #271, #269, #265) (Bogdan Padalko, Lars Strojny)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.8.0...v1.9.0 1.9.0beta2 1.3.0 beta stable PHP License * AMQP types are now better supported through value objects (see #271, #269, #265) (Bogdan Padalko, Lars Strojny)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.8.0...v1.9.0beta2 1.9.0beta1 1.3.0 stable stable PHP License * AMQP types are now better supported through value objects (see #271, #269, #265) (Bogdan Padalko, Lars Strojny) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.8.0...v1.9.0beta1 1.8.0 1.2.0 stable stable PHP License * Add SSL connection support (Bogdan Padalko) * Support for server method handling: confirms (publisher acknowledgments) and basic.return (Bogdan Padalko) * Add support for pkg-config (Remi Collet) * Preserve AMQP server error code for exceptions (Bogdan Padalko) * Add AMQPChannel::close() (Bogdan Padalko) * Fix segfault when deleting an unknown exchange (Bogdan Padalko) * Fix segfault with PHPUnit and xdebug for PHP 7 (Bogdan Padalko) * Add publisher confirms (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.7.1...v1.8.0 1.8.0beta2 1.2.0 beta stable PHP License * Add SSL connection support (Bogdan Padalko) * Support for server method handling: confirms (publisher acknowledgments) and basic.return (Bogdan Padalko) * Add support for pkg-config (Remi Collet) * Preserve AMQP server error code for exceptions (Bogdan Padalko) * Add AMQPChannel::close() (Bogdan Padalko) * Fix segfault when deleting an unknown exchange (Bogdan Padalko) * Fix segfault with PHPUnit and xdebug for PHP 7 (Bogdan Padalko) * Add publisher confirms (Bogdan Padalko) * Fix 1.8.0 release (Lars Strojny) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.7.1...v1.8.0beta2 1.7.1 1.0.0 stable stable PHP License * Add support for pkg-config (Remi Collet) * Fixed wrongful truncation of amqp.password to the length of amqp.login (https://github.com/skobkars)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.7.0...v1.7.1 1.7.0 1.0.0 stable stable PHP License * Add PHP7 support (Bogdan Padalko, Steffen Hanikel) * Add AMQPEnvelope::hasHeader(), AMQPExchange::hasArgument() and AMQPQueue::hasArgument() to check whether specific header exists (Bogdan Padalko) * Fix AMQPConnection::setPort() writes to wrong property (Bogdan Padalko) * Add compiled librabbitmq version early check (Bogdan Padalko) * Fix segfault when channel zval type != IS_OBJECT (Bogdan Padalko) * Fix API breakage when rabbitmq-c < 0.6.0 used (Bogdan Padalko) * Close connection on library errors (Bogdan Padalko) * Do not store connection resource ID string (Bogdan Padalko) * Explicitly cleanup references on connection on cleanup (Bogdan Padalko) * Show effective connection values when connection is active and passed values otherwise (Bogdad Padalko) * Completely move to zend object custom objects (AMQPEnvelope, AMQPExchange and AMQPQueue) (Bogdan Padalko) * Use zend object on custom objects for properties storing (AMQPConnection and AMQPChannel) (Bogdan Padalko) * Fix not properly deleted connection resource. (Bogdan Padalko, Steffen Hanikel) * Fix not properly allocated and freed amqp_table_t arguments table memory. (Bogdan Padalko, Steffen Hanikel) * Upgrade vagrant box to Ubuntu 15.10 Wily Werwof (Bogdan Padalko) * Fix various grammar and spelling mistakes (Artem Gordinsky) * Update stubs (Sascha-Oliver Prolic)For a complete list of changes see:https://github.com/pdezwart/php-amqp/compare/v1.6.0...v1.7.0 1.7.0alpha2 1.0.0 beta stable PHP License * Fix AMQPConnection::setPort() writes to wrong property (Bogdan Padalko) * Upgrade vagrant box to Ubuntu 15.10 Wily Werwof (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.7.0alpha1...v1.7.0alpha2 1.7.0alpha1 1.0.0 beta stable PHP License * Add PHP7 support (Bogdan Padalko, Steffen Hanikel) * Add AMQPEnvelope::hasHeader(), AMQPExchange::hasArgument() and AMQPQueue::hasArgument() to check whether specific header exists (Bogdan Padalko) * Completely move to zend object custom objects (AMQPEnvelope, AMQPExchange and AMQPQueue) (Bogdan Padalko) * Use zend object on custom objects for properties storing (AMQPConnection and AMQPChannel) (Bogdan Padalko) * Fix not properly deleted connection resource. (Bogdan Padalko, Steffen Hanikel) * Fix not properly allocated and freed amqp_table_t arguments table memory. (Bogdan Padalko, Steffen Hanikel) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.6.0...v1.7.0alpha1 1.6.0 1.0.0 stable stable 2015-11-03 BSD style 1.6.0 Release: * Various build fixes (Remi Collet) * librabbitmq 0.5 compatibility (Remi Collet) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.6.0beta4...v1.6.0 1.6.0beta4 1.0.0 beta stable 2015-09-18 1.6.0beta4 Release: * Add ability to re-attach consuming callback (Bogdan Padalko) * Add AMQPQueue::getConsumerTag() method and fix consumer tag handling in AMQPQueue class methods (Bogdan Padalko) * Add channel_max, frame_max and hearbeat support (see AMQPConnection::__construct() method) (librabbitmq version >= 0.6.0 required) (Bogdan Padalko) * Fix issue with message truncating to first null-byte during sending (Bogdan Padalko, special thanks to Alex Kazinskiy, Alvaro Videla and Michael Klishin) * Fix issue with message truncating to first null-byte during sending (Bogdan Padalko) * Fix invalid delivery mode returned by AMQPEnvelop::getDeliveryMode (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.6.0beta3...v1.6.0beta4 1.6.0beta3 1.0.0 beta stable 2015-04-18 1.6.0beta3 Release: * Add basic.recover AMQP method support (see AMQPChannel::basicRecover() method) (Bogdan Padalko) * Fix building on OS X (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.6.0beta2...v1.6.0beta3 1.6.0beta2 1.0.0 beta stable 2015-01-27 1.6.0beta2 Release: * Pulled 1.6.0beta1, as it had the stable tag * Add support for nested arguments values (Bogdan Padalko) * Add auto_delete and internal flags support for AMQPExchange::declare (librabbitmq version > 0.5.2 required) (Bogdan Padalko) * Fix persistence support (Bogdan Padalko) * Add AMQPExchange::unbind method and fix AMQPExchange::bind method. WARNING: this can potentially break BC (Bogdan Padalko) * Add support to consume messages from multiple queues (Bogdan Padalko) * Add AMQP_DURABLE flag support to AMQPExchange::setFlags (librabbitmq version > 0.5.2 required) (Bogdan Padalko) * Fix inconsistent INI values comparison which leads to deprecation warnings (Bogdan Padalko) * Various segfault and memory leak fixes (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.4.0...v1.6.0beta2 1.4.0 1.0.0 stable stable 2014-04-14 1.4.0 Release: * Fix #72: Publishing to an exchange with an empty name is valid and should not throw an exception (lstrojny) * Fix #77: AMQPQueue::delete() now no longer returns a boolean, but an integer of how many messages were deleted. WARNING: this can potentially break BC (Bogdan Padalko) * Fix #75: adhering to the AMQP spec by closing channel and sometimes even the connection in case of certain errors (Bogdan Padalko) * Fix #81: Add optional arguments parameter to bind()/unbind() (Michael Squires) * Fix #82: additional getters (getChannel(), getConnection()) (Bogdan Padalko) * Fix #92: fix various memory leaks in the AMQPConnection class (Lars Strojny) * Using amqp_error_string2() instead of deprecated amqp_error_string() (Lars Strojny) * Fix memory leaks in setHost, setLogin, setPassword, setVhost (Lars Strojny, Bogdan Padalko) * Fixed a memleak in php_amqp_connect (Julien Pauli) * Use rabbitmq-c defaults for max channels and default frame size (Bogdan Padalko) * Fix socket timeout error when connecting over high-latency network (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.4.0beta2...v1.4.0 1.4.0beta2 1.0.0 beta stable 2014-03-08 1.4.0beta2 Release: * - For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.4.0beta1...v1.4.0beta2 1.4.0beta1 1.0.0 beta stable 2014-01-15 1.4.0beta1 Release: * - For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.3.0...v1.4.0beta1 1.3.0 1.0.0 beta stable 2013-11-25 1.3.0 Release: * Allow retrieving auto-delete exchanges (Guilherme Blanco) * Add connection timeout support. This requires bumping the version requirement for librabbitmq to >= 0.4.1 (Bogdan Padalko) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.2.0...v1.3.0 1.2.0 1.0.0 stable stable 2013-05-28 1.2.0 Release: * New methods AMQPChannel::getPrefetchCount() and AMQPChannel::getPrefetchSize() * Deprecate AMQPQueue::declare() in favor of AMQPQueue::declareQueue() * Deprecate AMQPExchange::declare() in favor of AMQPExchange::declareExchange() * Smaller fixes to our stubs For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.0.10...v1.2.0 1.0.10 1.0.0 stable stable 2013-05-28 1.0.10 Release: * report correct version in module info (Lars Strojny) * fix class interface definitions (Vladimir Kartaviy) * add ability to bind a queue with an empty routing key (Vladimir Kartaviy) * fix constant AMQP_IFUNUSED (Florin Patan, Bernhard Weisshuhn) * added stubs for ide use (Vladimir Kartaviy, Bernhard Weisshuhn) * Fixed memory leak in queue->declareQueue (Ilya a.k.a. coodix) * support for php 5.5 (Lars Strojny) * add support for read and write timeouts (Bogdan Padalko) * fix memory leak in queue->consume (Dmitry Vinogradov) * add support for custom exchange types (empi89) * support for nested custom headers (Bernhard Weisshuhn) * fix memory (Bernhard Weisshuhn) For a complete list of changes see: https://github.com/pdezwart/php-amqp/compare/v1.0.9...v1.0.10 1.0.9 1.0.0 stable stable 2012-11-13 1.0.9 Release: * Fix pecl relase 1.0.8 1.0.0 stable stable 2012-11-12 1.0.8 Release: * Skip var_dump test on PHP 5.2 * Initialize consumer tag string length to zero * Support connection time outs * Adding consumer_tag parameter to AMQPQueue::cancel * Clean up error code handling 1.0.7 1.0.0 stable stable 2012-09-10 1.0.7 Release: * Adding missing macros 1.0.6 1.0.0 stable stable 2012-09-10 1.0.6 Release: * 62354: Segmentation fault when printing or dumping an object that contains an AMQP object * Adding in missing tests * Fixing release number in PHP information * Adding .gitignore info for Git users * Cleaning up debug handling 1.0.5 1.0.0 stable stable 2012-08-26 1.0.5 Release: * 62696: Incorrect exchange type * Handles server connections being closed during consume and publish correctly * 62628: Exception thrown in consume will lock PHP * 61533: Segmentation fault when instantiating channel, queue or exchange with wrong object, then using it 1.0.4 1.0.0 stable stable 2012-07-18 1.0.4 Release: * 62549: Fixing broken persistent connection * 62412: Fixing segfault due to destruction order * 62411: Fixing declaration overload bug * 62410: Fixing declaration overload for 5.4 * 61337: Adding License file * 61749: Fixing handling for binary content in envelope * 62087: Adding appropriate version information * 62354: Enabling debugging dumping of objects * 61351: Updating min PHP version requirements to 5.2.0 1.0.3 1.0.0 stable stable 2012-05-19 1.0.3 Release: * Fixing compilation issue with PHP 5.4 * Memory leak when using AMQPQueue::get from a queue with no messages 1.0.1 1.0.0 stable stable 2012-03-02 1.0.1 Release:Fixed bug: * 61247: Allow queue creation with empty queue name, and return auto generated name * 61127: Segmentation fault when cleaning up an AMQPChannel without calling AMQPConnection::connect first 1.0.0 1.0.0 stable stable 2012-02-15 1.0.0 Release:Changed/finalized API signature: * Exposing AMQPChannel * Exposing AMQPEnvelope * Exposing more queue and exchange arguments and flags * Exposing basic.qosAdded persistent connectionsCleaned up codebaseFixed memory leaks and segmentation faults 0.3.1 0.0.1 beta beta 2011-09-08 0.3.1 Release:Fixed bug: * 24323: Cannot get the name for auto-named reply-to queues 0.3.0 0.0.1 beta beta 2011-06-09 0.3.0 Release:Fixed memory leaks in many functions (courtesy Jonathan Tansavatdi and Andy Wick)Fixed consume method to return proper valuesCleaned up variable usageFixed bugs: * 22638: Unexpected exit code 1 with AMQPQueue::consume() * 22698: AMQPQueue::consume 0.2.2 0.0.1 beta beta 2011-01-02 0.2.2 Release:Made extension compatible with PHP lt 5.3 (courtesy John Skopis)Fixed wrong typing of message properties (courtesy John Skopis) 0.2.1 0.0.1 beta beta 2010-12-10 0.2.1 Release:Fixed refcount decrementing bug causing segfaults. 0.2.0 0.0.1 beta beta 2010-12-10 0.2.0 Release:Works with AMQP 0-8 and 0-9-1 (used by RabbitMQ 2.*)Modified AMQPConnection object: * Requires call to 'connect' method to connect (no longer connects on instantiation) * Added support for disconnect and reconnect * Added helper setters for port, host, vhost, login and passwordImproved consume method to block for MIN messages, and try to get MAX messages if availableFixed zval descoping bugsFixed bugs: * 17809: Couldn't compile pecl extension under PHP 5.3 * 17831: Segmentation fault when the exchange doesn't exists * 19707: AMQPQueue::get() doesn't return the message * 19840: Connection Exception 0.1.1 0.0.1 beta beta 2010-08-19 Updating extension to work with new rabbitmq-c library 0.1.0 0.0.1 beta beta 2010-06-19 - Initial release amqp-2.1.2/config.m40000644000076500000240000001230714553444052013741 0ustar lstrojnystaffdnl config.m4 for extension amqp PHP_ARG_WITH(amqp, for amqp support, [ --with-amqp Include amqp support]) PHP_ARG_WITH(librabbitmq-dir, for amqp, [ --with-librabbitmq-dir[=DIR] Set the path to librabbitmq install prefix.], yes) dnl Set test wrapper binary to ignore any local ini settings if test "$PHP_AMQP" != "no"; then AC_MSG_CHECKING([for supported PHP versions]) PHP_REF_FOUND_VERSION=$PHP_VERSION PHP_REF_FOUND_VERNUM=$PHP_VERSION_ID if test -z "$PHP_REF_FOUND_VERNUM"; then if test -z "$PHP_CONFIG"; then AC_MSG_ERROR([php-config not found]) fi PHP_REF_FOUND_VERSION=`${PHP_CONFIG} --version` PHP_REF_FOUND_VERNUM=`${PHP_CONFIG} --vernum` fi if test "$PHP_REF_FOUND_VERNUM" -lt "50600"; then AC_MSG_ERROR([PHP version not supported, >= 5.6 required, but $PHP_REF_FOUND_VERSION found]) else AC_MSG_RESULT([supported ($PHP_REF_FOUND_VERSION)]) fi AC_MSG_RESULT($PHP_AMQP) dnl # --with-amqp -> check with-path NEW_LAYOUT=rabbitmq-c/framing.h OLD_LAYOUT=amqp_framing.h AC_PATH_PROG(PKG_CONFIG, pkg-config, no) HAVE_LIBRABBITMQ_NEW_LAYOUT=0 if test "$PHP_LIBRABBITMQ_DIR" = "yes" -a -x $PKG_CONFIG; then AC_MSG_CHECKING([for amqp using pkg-config]) if ! $PKG_CONFIG --exists librabbitmq ; then AC_MSG_ERROR([librabbitmq not found]) fi LIBRABBITMQ_VERSION=`$PKG_CONFIG librabbitmq --modversion` AC_MSG_RESULT([found version $LIBRABBITMQ_VERSION]) if ! $PKG_CONFIG librabbitmq --atleast-version 0.8.0 ; then AC_MSG_ERROR([librabbitmq must be version 0.8.0 or greater]) fi if ! $PKG_CONFIG librabbitmq --atleast-version 0.10.0 ; then AC_MSG_WARN([librabbitmq 0.10.0 or greater recommended, current version is $LIBRABBITMQ_VERSION]) fi if test -r `$PKG_CONFIG librabbitmq --variable=includedir`/$NEW_LAYOUT; then HAVE_LIBRABBITMQ_NEW_LAYOUT=1 fi PHP_AMQP_LIBS=`$PKG_CONFIG librabbitmq --libs` PHP_AMQP_INCS=`$PKG_CONFIG librabbitmq --cflags` PHP_EVAL_LIBLINE($PHP_AMQP_LIBS, AMQP_SHARED_LIBADD) PHP_EVAL_INCLINE($PHP_AMQP_INCS) else AC_MSG_CHECKING([for amqp files in default path]) if test "$PHP_LIBRABBITMQ_DIR" != "no" && test "$PHP_LIBRABBITMQ_DIR" != "yes"; then for i in $PHP_LIBRABBITMQ_DIR; do if test -r $i/include/$NEW_LAYOUT; then AMQP_DIR=$i HAVE_LIBRABBITMQ_NEW_LAYOUT=1 AC_MSG_RESULT(found in $i) break fi if test -r $i/include/$OLD_LAYOUT; then AMQP_DIR=$i AC_MSG_RESULT(found in $i) break fi done else for i in $PHP_AMQP /usr/local /usr ; do if test -r $i/include/$NEW_LAYOUT; then AMQP_DIR=$i HAVE_LIBRABBITMQ_NEW_LAYOUT=1 AC_MSG_RESULT(found in $i) break fi if test -r $i/include/$OLD_LAYOUT; then AMQP_DIR=$i AC_MSG_RESULT(found in $i) break fi done fi if test -z "$AMQP_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_ERROR([Please reinstall the librabbitmq distribution itself or (re)install librabbitmq development package if it available in your system]) fi dnl # --with-amqp -> add include path PHP_ADD_INCLUDE($AMQP_DIR/include) old_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -I$AMQP_DIR/include" AC_CACHE_CHECK(for librabbitmq version, ac_cv_librabbitmq_version, [ AC_RUN_IFELSE([AC_LANG_SOURCE([[ #include "amqp.h" #include int main () { FILE *testfile = fopen("conftestval", "w"); if (NULL == testfile) { return 1; } fprintf(testfile, "%s\n", AMQ_VERSION_STRING); fclose(testfile); return 0; } ]])],[ac_cv_librabbitmq_version=`cat ./conftestval`],[ac_cv_librabbitmq_version=NONE],[ac_cv_librabbitmq_version=NONE]) ]) CFLAGS=$old_CFLAGS if test "$ac_cv_librabbitmq_version" != "NONE"; then ac_IFS=$IFS IFS=. set $ac_cv_librabbitmq_version IFS=$ac_IFS LIBRABBITMQ_API_VERSION=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3` if test "$LIBRABBITMQ_API_VERSION" -lt 8000 ; then AC_MSG_ERROR([librabbitmq must be version 0.8.0 or greater, $ac_cv_librabbitmq_version version given instead]) fi if test "$LIBRABBITMQ_API_VERSION" -lt 10000 ; then AC_MSG_WARN([librabbitmq 0.10.0 or greater recommended, current version is $ac_cv_librabbitmq_version]) fi else AC_MSG_ERROR([could not determine librabbitmq version]) fi dnl # --with-amqp -> check for lib and symbol presence LIBNAME=rabbitmq LIBSYMBOL=rabbitmq PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $AMQP_DIR/$PHP_LIBDIR, AMQP_SHARED_LIBADD) fi AC_MSG_CHECKING([for new librabbitmq layout]) AC_MSG_RESULT([${HAVE_LIBRABBITMQ_NEW_LAYOUT}]) AC_DEFINE_UNQUOTED(HAVE_LIBRABBITMQ_NEW_LAYOUT, ${HAVE_LIBRABBITMQ_NEW_LAYOUT}, ["Librabbitmq new layout"]) PHP_SUBST(AMQP_SHARED_LIBADD) AMQP_SOURCES="amqp.c amqp_envelope_exception.c amqp_type.c amqp_exchange.c amqp_queue.c amqp_connection.c amqp_connection_resource.c amqp_channel.c amqp_envelope.c amqp_basic_properties.c amqp_methods_handling.c amqp_value.c amqp_timestamp.c amqp_decimal.c" PHP_NEW_EXTENSION(amqp, $AMQP_SOURCES, $ext_shared) fi amqp-2.1.2/config.w320000644000076500000240000000131514553444052014031 0ustar lstrojnystaffARG_WITH("amqp", "AMQP support", "no"); if (PHP_AMQP != "no") { if (CHECK_HEADER_ADD_INCLUDE("amqp.h", "CFLAGS_AMQP", PHP_PHP_BUILD + "\\include;" + PHP_PHP_BUILD + "\\include\\librabbitmq;" + PHP_AMQP) && CHECK_LIB("rabbitmq.4.lib", "amqp", PHP_PHP_BUILD + "\\lib;" + PHP_AMQP)) { // ADD_FLAG("CFLAGS_AMQP", "/D HAVE_AMQP_GETSOCKOPT"); EXTENSION('amqp', 'amqp.c amqp_envelope_exception.c amqp_type.c amqp_exchange.c amqp_queue.c amqp_connection.c amqp_connection_resource.c amqp_channel.c amqp_envelope.c amqp_basic_properties.c amqp_methods_handling.c amqp_value.c amqp_timestamp.c amqp_decimal.c'); AC_DEFINE('HAVE_AMQP', 1); } else { WARNING("amqp not enabled; libraries and headers not found"); } } amqp-2.1.2/benchmark.php0000644000076500000240000000555014553444052014677 0ustar lstrojnystaffgetVersion().')'; } catch (Exception $e) { $xdebug = '(without xdebug)'; } $ext = new ReflectionExtension('amqp'); $srcVersion = $ext->getVersion(); echo 'Running benchmark for php-amqp ', $srcVersion, ' on PHP ', PHP_VERSION, ' ', $xdebug, PHP_EOL; $iterations = 10000; if (isset($argv[1])) { $iterations = max((int) $argv[1], 0) ?: $iterations; } echo ' running ', $iterations, ' iterations:', PHP_EOL, PHP_EOL; $conn = new AMQPConnection(); $conn->setHost(getenv('PHP_AMQP_HOST')); $conn->connect(); $ch = new AMQPChannel($conn); $exchange = new AMQPExchange($ch); $exchange->setType(AMQP_EX_TYPE_FANOUT); $exchange->setFlags(AMQP_AUTODELETE); $exchange->setName('benchmark_exchange_' . bin2hex(random_bytes(32))); $exchange->declareExchange(); $q = new AMQPQueue($ch); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $q->bind($exchange->getName()); $message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; $timer = microtime(true); for ($i = 0; $i < $iterations; $i++) { $exchange->publish($message); } $timer = microtime(true) - $timer; echo 'Publish: ', $iterations, ' iterations took ', $timer, 'sec', PHP_EOL; $timer = microtime(true); for ($i = 0; $i < $iterations; $i++) { if (!$q->get(AMQP_AUTOACK)) { echo 'GET failed', PHP_EOL; } } $timer = microtime(true) - $timer; echo ' Get: ', $iterations, ' iterations took ', $timer, 'sec', PHP_EOL; $q->delete(); $exchange->delete(); echo PHP_EOL; // ================================== $exchange = new AMQPExchange($ch); $exchange->setType(AMQP_EX_TYPE_FANOUT); $exchange->setFlags(AMQP_AUTODELETE); $exchange->setName('benchmark_exchange_' . bin2hex(random_bytes(32))); $exchange->declareExchange(); $q = new AMQPQueue($ch); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $q->bind($exchange->getName()); $timer = microtime(true); for ($i = 0; $i < $iterations; $i++) { $exchange->publish($message); } $timer = microtime(true) - $timer; echo 'Publish: ', $iterations, ' iterations took ', $timer, 'sec', PHP_EOL; $consumer_iterations = $iterations; $timer = microtime(true); $q->consume( function () use (&$consumer_iterations) { return (--$consumer_iterations > 0); }, AMQP_AUTOACK); $timer = microtime(true) - $timer; echo 'Consume: ', $iterations, ' iterations took ', $timer, 'sec', PHP_EOL; $q->delete(); $exchange->delete(); amqp-2.1.2/CREDITS0000644000076500000240000000140314553444052013245 0ustar lstrojnystaffAMQP bindings for PHP All who contributed to php-amqp project Alexandre Kalendarev (original author) Pieter de Zwart (lead) Andrey Hristov (contributor) Brad Rodriguez (contributor) John Skopis (contributor - PHP < 5.3 compatibility) Andy Wick (contributor - bug fixes, custom headers support) Jonathan Tansavatdi (contributor) Bernhard Weisshuhn (maintainer) Lars Strojny (maintainer) Anatoliy Belsky (contributor) Alex Sladkov (contributor) Vladimir Kartaviy (contributor) Florin Patan (reported) Ilya a.k.a. coodix (contributor) Bogdan Padalko (contributor) Dmitry Vinogradov (contributor) Peter Hansen (contributor) Michael K. Squires (contributor)amqp-2.1.2/LICENSE0000644000076500000240000000620414553444052013236 0ustar lstrojnystaff-------------------------------------------------------------------- The PHP License, version 3.01 Copyright (c) 1999 - 2012 The PHP Group. All rights reserved. -------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name "PHP" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact group@php.net. 4. Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net. You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo" 5. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License. 6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP software, freely available from ". THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------- This software consists of voluntary contributions made by many individuals on behalf of the PHP Group. The PHP Group can be contacted via Email at group@php.net. For more information on the PHP Group and the PHP project, please see . PHP includes the Zend Engine, freely available at . amqp-2.1.2/tests/_test_helpers.php.inc0000644000076500000240000000427714553444052017524 0ustar lstrojnystaff$m()); } } function dump_message($msg) { if (!$msg) { var_dump($msg); return false; } echo get_class($msg), PHP_EOL; echo " getBody:", PHP_EOL, " "; var_dump($msg->getBody()); echo " getContentType:", PHP_EOL, " "; var_dump($msg->getContentType()); echo " getRoutingKey:", PHP_EOL, " "; var_dump($msg->getRoutingKey()); echo " getConsumerTag:", PHP_EOL, " "; var_dump($msg->getConsumerTag()); echo " getDeliveryTag:", PHP_EOL, " "; var_dump($msg->getDeliveryTag()); echo " getDeliveryMode:", PHP_EOL, " "; var_dump($msg->getDeliveryMode()); echo " getExchangeName:", PHP_EOL, " "; var_dump($msg->getExchangeName()); echo " isRedelivery:", PHP_EOL, " "; var_dump($msg->isRedelivery()); echo " getContentEncoding:", PHP_EOL, " "; var_dump($msg->getContentEncoding()); echo " getType:", PHP_EOL, " "; var_dump($msg->getType()); echo " getTimeStamp:", PHP_EOL, " "; var_dump($msg->getTimeStamp()); echo " getPriority:", PHP_EOL, " "; var_dump($msg->getPriority()); echo " getExpiration:", PHP_EOL, " "; var_dump($msg->getExpiration()); echo " getUserId:", PHP_EOL, " "; var_dump($msg->getUserId()); echo " getAppId:", PHP_EOL, " "; var_dump($msg->getAppId()); echo " getMessageId:", PHP_EOL, " "; var_dump($msg->getMessageId()); echo " getReplyTo:", PHP_EOL, " "; var_dump($msg->getReplyTo()); echo " getCorrelationId:", PHP_EOL, " "; var_dump($msg->getCorrelationId()); echo " getHeaders:", PHP_EOL, " "; var_dump($msg->getHeaders()); return false; } function consumeThings($message, $queue) { var_dump($message); return false; } amqp-2.1.2/amqp.c0000644000076500000240000004705614553444052013345 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "zend_ini.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #else #include #include #endif #include "php_amqp.h" #include "amqp_connection.h" #include "amqp_basic_properties.h" #include "amqp_connection_resource.h" #include "amqp_channel.h" #include "amqp_envelope.h" #include "amqp_envelope_exception.h" #include "amqp_exchange.h" #include "amqp_queue.h" #include "amqp_value.h" #include "amqp_timestamp.h" #include "amqp_decimal.h" #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif /* True global resources - no need for thread safety here */ zend_class_entry *amqp_exception_class_entry, *amqp_connection_exception_class_entry, *amqp_channel_exception_class_entry, *amqp_exchange_exception_class_entry, *amqp_queue_exception_class_entry, *amqp_value_exception_class_entry; /* {{{ amqp_functions[] * *Every user visible function must have an entry in amqp_functions[]. */ zend_function_entry amqp_functions[] = { {NULL, NULL, NULL} }; /* }}} */ bool php_amqp_is_valid_identifier(zend_string *val) { return ZSTR_LEN(val) > 0 && ZSTR_LEN(val) <= PHP_AMQP_MAX_IDENTIFIER_LENGTH; } bool php_amqp_is_valid_credential(zend_string *val) { return ZSTR_LEN(val) > 0 && ZSTR_LEN(val) <= PHP_AMQP_MAX_CREDENTIALS_LENGTH; } bool php_amqp_is_valid_port(zend_long val) { return val >= PHP_AMQP_MIN_PORT && val <= PHP_AMQP_MAX_PORT; } bool php_amqp_is_valid_timeout(double timeout) { return timeout >= 0; } bool php_amqp_is_valid_channel_max(zend_long val) { return val > 0 && val <= PHP_AMQP_DEFAULT_CHANNEL_MAX; } bool php_amqp_is_valid_frame_size_max(zend_long val) { return val > 0 && val <= PHP_AMQP_MAX_FRAME_SIZE; } bool php_amqp_is_valid_heartbeat(zend_long val) { return val >= 0 && val <= PHP_AMQP_MAX_HEARTBEAT; } bool php_amqp_is_valid_prefetch_size(zend_long val) { return val >= 0 && val <= PHP_AMQP_MAX_PREFETCH_SIZE; } bool php_amqp_is_valid_prefetch_count(zend_long val) { return val >= 0 && val <= PHP_AMQP_MAX_PREFETCH_COUNT; } static ZEND_INI_MH(onUpdateIdentifier) { if (new_value != NULL && !php_amqp_is_valid_identifier(new_value)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdateCredentials) { if (new_value != NULL && !php_amqp_is_valid_credential(new_value)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdatePort) { zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name); if (!php_amqp_is_valid_port(val)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdateTimeout) { if (!php_amqp_is_valid_timeout(zend_strtod(ZSTR_VAL(new_value), NULL))) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdateChannelMax) { zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name); if (!php_amqp_is_valid_channel_max(val)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdateFrameSizeMax) { zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name); if (!php_amqp_is_valid_frame_size_max(val)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdateHeartbeat) { zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name); if (!php_amqp_is_valid_heartbeat(val)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdatePrefetchCount) { zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name); if (!php_amqp_is_valid_prefetch_count(val)) { return FAILURE; } return SUCCESS; } static ZEND_INI_MH(onUpdatePrefetchSize) { zend_long val = zend_ini_parse_quantity_warn(new_value, entry->name); if (!php_amqp_is_valid_prefetch_size(val)) { return FAILURE; } return SUCCESS; } PHP_INI_BEGIN() PHP_INI_ENTRY("amqp.host", DEFAULT_HOST, PHP_INI_ALL, onUpdateIdentifier) PHP_INI_ENTRY("amqp.vhost", DEFAULT_VHOST, PHP_INI_ALL, onUpdateIdentifier) PHP_INI_ENTRY("amqp.port", DEFAULT_PORT, PHP_INI_ALL, onUpdatePort) PHP_INI_ENTRY("amqp.timeout", DEFAULT_TIMEOUT, PHP_INI_ALL, onUpdateTimeout) PHP_INI_ENTRY("amqp.read_timeout", DEFAULT_READ_TIMEOUT, PHP_INI_ALL, onUpdateTimeout) PHP_INI_ENTRY("amqp.write_timeout", DEFAULT_WRITE_TIMEOUT, PHP_INI_ALL, onUpdateTimeout) PHP_INI_ENTRY("amqp.connect_timeout", DEFAULT_CONNECT_TIMEOUT, PHP_INI_ALL, onUpdateTimeout) PHP_INI_ENTRY("amqp.rpc_timeout", DEFAULT_RPC_TIMEOUT, PHP_INI_ALL, onUpdateTimeout) PHP_INI_ENTRY("amqp.login", DEFAULT_LOGIN, PHP_INI_ALL, onUpdateCredentials) PHP_INI_ENTRY("amqp.password", DEFAULT_PASSWORD, PHP_INI_ALL, onUpdateCredentials) PHP_INI_ENTRY("amqp.auto_ack", DEFAULT_AUTOACK, PHP_INI_ALL, NULL) PHP_INI_ENTRY("amqp.prefetch_count", DEFAULT_PREFETCH_COUNT, PHP_INI_ALL, onUpdatePrefetchCount) PHP_INI_ENTRY("amqp.prefetch_size", DEFAULT_PREFETCH_SIZE, PHP_INI_ALL, onUpdatePrefetchSize) PHP_INI_ENTRY("amqp.global_prefetch_count", DEFAULT_GLOBAL_PREFETCH_COUNT, PHP_INI_ALL, onUpdatePrefetchCount) PHP_INI_ENTRY("amqp.global_prefetch_size", DEFAULT_GLOBAL_PREFETCH_SIZE, PHP_INI_ALL, onUpdatePrefetchSize) PHP_INI_ENTRY("amqp.channel_max", DEFAULT_CHANNEL_MAX, PHP_INI_ALL, onUpdateChannelMax) PHP_INI_ENTRY("amqp.frame_max", DEFAULT_FRAME_MAX, PHP_INI_ALL, onUpdateFrameSizeMax) PHP_INI_ENTRY("amqp.heartbeat", DEFAULT_HEARTBEAT, PHP_INI_ALL, onUpdateHeartbeat) PHP_INI_ENTRY("amqp.cacert", DEFAULT_CACERT, PHP_INI_ALL, NULL) PHP_INI_ENTRY("amqp.cert", DEFAULT_CERT, PHP_INI_ALL, NULL) PHP_INI_ENTRY("amqp.key", DEFAULT_KEY, PHP_INI_ALL, NULL) PHP_INI_ENTRY("amqp.verify", DEFAULT_VERIFY, PHP_INI_ALL, NULL) PHP_INI_ENTRY("amqp.sasl_method", PHP_AMQP_STRINGIFY(DEFAULT_SASL_METHOD), PHP_INI_ALL, NULL) STD_PHP_INI_ENTRY( "amqp.serialization_depth", DEFAULT_SERIALIZATION_DEPTH, PHP_INI_ALL, OnUpdateLongGEZero, serialization_depth, zend_amqp_globals, amqp_globals ) STD_PHP_INI_ENTRY( "amqp.deserialization_depth", DEFAULT_SERIALIZATION_DEPTH, PHP_INI_ALL, OnUpdateLongGEZero, deserialization_depth, zend_amqp_globals, amqp_globals ) PHP_INI_END() ZEND_DECLARE_MODULE_GLOBALS(amqp) static PHP_GINIT_FUNCTION(amqp) /* {{{ */ { #if defined(COMPILE_DL_AMQP) && defined(ZTS) ZEND_TSRMLS_CACHE_UPDATE(); #endif memset(amqp_globals, 0, sizeof(*amqp_globals)); amqp_globals->error_message = NULL; amqp_globals->error_code = 0; } /* }}} */ static PHP_MINIT_FUNCTION(amqp) /* {{{ */ { #if defined(COMPILE_DL_AMQP) && defined(ZTS) ZEND_TSRMLS_CACHE_UPDATE(); #endif zend_class_entry ce; /* Set up the connection resource */ le_amqp_connection_resource = zend_register_list_destructors_ex( amqp_connection_resource_dtor, NULL, PHP_AMQP_CONNECTION_RES_NAME, module_number ); le_amqp_connection_resource_persistent = zend_register_list_destructors_ex( NULL, amqp_connection_resource_dtor_persistent, PHP_AMQP_CONNECTION_RES_NAME, module_number ); /* Exceptions */ INIT_CLASS_ENTRY(ce, "AMQPException", NULL); amqp_exception_class_entry = zend_register_internal_class_ex(&ce, zend_exception_get_default()); INIT_CLASS_ENTRY(ce, "AMQPConnectionException", NULL); amqp_connection_exception_class_entry = zend_register_internal_class_ex(&ce, amqp_exception_class_entry); INIT_CLASS_ENTRY(ce, "AMQPChannelException", NULL); amqp_channel_exception_class_entry = zend_register_internal_class_ex(&ce, amqp_exception_class_entry); INIT_CLASS_ENTRY(ce, "AMQPQueueException", NULL); amqp_queue_exception_class_entry = zend_register_internal_class_ex(&ce, amqp_exception_class_entry); INIT_CLASS_ENTRY(ce, "AMQPExchangeException", NULL); amqp_exchange_exception_class_entry = zend_register_internal_class_ex(&ce, amqp_exception_class_entry); INIT_CLASS_ENTRY(ce, "AMQPValueException", NULL); amqp_value_exception_class_entry = zend_register_internal_class_ex(&ce, amqp_exception_class_entry); PHP_MINIT(amqp_connection)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_channel)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_queue)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_exchange)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_basic_properties)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_envelope)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_envelope_exception)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_value)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_timestamp)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(amqp_decimal)(INIT_FUNC_ARGS_PASSTHRU); REGISTER_INI_ENTRIES(); REGISTER_STRING_CONSTANT("AMQP_EXTENSION_VERSION", PHP_AMQP_VERSION, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_EXTENSION_VERSION_MAJOR", PHP_AMQP_VERSION_MAJOR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_EXTENSION_VERSION_MINOR", PHP_AMQP_VERSION_MINOR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_EXTENSION_VERSION_PATCH", PHP_AMQP_VERSION_PATCH, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("AMQP_EXTENSION_VERSION_EXTRA", PHP_AMQP_VERSION_EXTRA, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_EXTENSION_VERSION_ID", PHP_AMQP_VERSION_ID, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_NOPARAM", AMQP_NOPARAM, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_JUST_CONSUME", AMQP_JUST_CONSUME, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_DURABLE", AMQP_DURABLE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_PASSIVE", AMQP_PASSIVE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_EXCLUSIVE", AMQP_EXCLUSIVE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_AUTODELETE", AMQP_AUTODELETE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_INTERNAL", AMQP_INTERNAL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_NOLOCAL", AMQP_NOLOCAL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_AUTOACK", AMQP_AUTOACK, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_IFEMPTY", AMQP_IFEMPTY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_IFUNUSED", AMQP_IFUNUSED, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_MANDATORY", AMQP_MANDATORY, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_IMMEDIATE", AMQP_IMMEDIATE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_MULTIPLE", AMQP_MULTIPLE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_NOWAIT", AMQP_NOWAIT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_REQUEUE", AMQP_REQUEUE, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("AMQP_EX_TYPE_DIRECT", AMQP_EX_TYPE_DIRECT, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("AMQP_EX_TYPE_FANOUT", AMQP_EX_TYPE_FANOUT, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("AMQP_EX_TYPE_TOPIC", AMQP_EX_TYPE_TOPIC, CONST_CS | CONST_PERSISTENT); REGISTER_STRING_CONSTANT("AMQP_EX_TYPE_HEADERS", AMQP_EX_TYPE_HEADERS, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_OS_SOCKET_TIMEOUT_ERRNO", AMQP_OS_SOCKET_TIMEOUT_ERRNO, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PHP_AMQP_MAX_CHANNELS", PHP_AMQP_MAX_CHANNELS, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_SASL_METHOD_PLAIN", AMQP_SASL_METHOD_PLAIN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_SASL_METHOD_EXTERNAL", AMQP_SASL_METHOD_EXTERNAL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_DELIVERY_MODE_TRANSIENT", AMQP_DELIVERY_NONPERSISTENT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("AMQP_DELIVERY_MODE_PERSISTENT", AMQP_DELIVERY_PERSISTENT, CONST_CS | CONST_PERSISTENT); return SUCCESS; } /* }}} */ static PHP_MSHUTDOWN_FUNCTION(amqp) /* {{{ */ { UNREGISTER_INI_ENTRIES(); return SUCCESS; } /* }}} */ static PHP_RSHUTDOWN_FUNCTION(amqp) /* {{{ */ { if (NULL != PHP_AMQP_G(error_message)) { efree(PHP_AMQP_G(error_message)); PHP_AMQP_G(error_message) = NULL; } PHP_AMQP_G(error_code) = 0; return SUCCESS; } /* }}} */ static PHP_MINFO_FUNCTION(amqp) /* {{{ */ { php_info_print_table_start(); php_info_print_table_header(2, "Version", PHP_AMQP_VERSION); php_info_print_table_header(2, "Compiled", __DATE__ " @ " __TIME__); php_info_print_table_header(2, "AMQP protocol version", "0-9-1"); php_info_print_table_header(2, "librabbitmq version", amqp_version()); php_info_print_table_header(2, "Default max channels per connection", DEFAULT_CHANNEL_MAX); php_info_print_table_header(2, "Default max frame size", DEFAULT_FRAME_MAX); php_info_print_table_header(2, "Default heartbeats interval", DEFAULT_HEARTBEAT); DISPLAY_INI_ENTRIES(); } /* }}} */ /* {{{ amqp_module_entry */ zend_module_entry amqp_module_entry = { STANDARD_MODULE_HEADER, "amqp", amqp_functions, PHP_MINIT(amqp), PHP_MSHUTDOWN(amqp), NULL, PHP_RSHUTDOWN(amqp), PHP_MINFO(amqp), PHP_AMQP_VERSION, PHP_MODULE_GLOBALS(amqp), PHP_GINIT(amqp), NULL, NULL, STANDARD_MODULE_PROPERTIES_EX }; /* }}} */ #ifdef COMPILE_DL_AMQP ZEND_GET_MODULE(amqp) #endif int php_amqp_error( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *connection_resource, amqp_channel_resource *channel_resource ) { return php_amqp_error_advanced(reply, message, connection_resource, channel_resource, 1); } int php_amqp_error_advanced( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *connection_resource, amqp_channel_resource *channel_resource, int fail_on_errors ) { assert(connection_resource != NULL); PHP_AMQP_G(error_code) = 0; if (*message != NULL) { efree(*message); } int res = php_amqp_connection_resource_error( reply, message, connection_resource, (amqp_channel_t) (channel_resource ? channel_resource->channel_id : 0) ); switch (res) { case PHP_AMQP_RESOURCE_RESPONSE_OK: break; case PHP_AMQP_RESOURCE_RESPONSE_ERROR: if (!fail_on_errors) { break; } /* Library or other non-protocol or even protocol related errors may be here. */ /* In most cases it indicates some underlying hard errors. Fail fast. */ case PHP_AMQP_RESOURCE_RESPONSE_ERROR_CONNECTION_CLOSED: /* Mark connection resource as closed to prevent sending any further requests */ connection_resource->is_connected = '\0'; /* Close connection with all its channels */ php_amqp_disconnect_force(connection_resource); break; case PHP_AMQP_RESOURCE_RESPONSE_ERROR_CHANNEL_CLOSED: /* Mark channel as closed to prevent sending channel.close request */ assert(channel_resource != NULL); if (channel_resource) { channel_resource->is_connected = '\0'; /* Close channel */ php_amqp_close_channel(channel_resource, 1); } /* No more error handling necessary, returning. */ break; default: spprintf(message, 0, "Unknown server error, method id 0x%08X (not handled by extension)", reply.reply.id); break; } return res; } void php_amqp_zend_throw_exception_short(amqp_rpc_reply_t reply, zend_class_entry *exception_ce) { php_amqp_zend_throw_exception(reply, exception_ce, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code)); } void php_amqp_zend_throw_exception( amqp_rpc_reply_t reply, zend_class_entry *exception_ce, const char *message, zend_long code ) { switch (reply.reply_type) { case AMQP_RESPONSE_NORMAL: break; case AMQP_RESPONSE_NONE: exception_ce = amqp_exception_class_entry; break; case AMQP_RESPONSE_LIBRARY_EXCEPTION: switch (reply.library_error) { case AMQP_STATUS_CONNECTION_CLOSED: case AMQP_STATUS_SOCKET_ERROR: case AMQP_STATUS_SOCKET_CLOSED: case AMQP_STATUS_SOCKET_INUSE: case AMQP_STATUS_BROKER_UNSUPPORTED_SASL_METHOD: case AMQP_STATUS_HOSTNAME_RESOLUTION_FAILED: exception_ce = amqp_connection_exception_class_entry; break; default: exception_ce = amqp_exception_class_entry; } break; case AMQP_RESPONSE_SERVER_EXCEPTION: switch (reply.reply.id) { case AMQP_CONNECTION_CLOSE_METHOD: /* Fatal errors - pass them to connection level */ exception_ce = amqp_connection_exception_class_entry; break; case AMQP_CHANNEL_CLOSE_METHOD: /* Most channel-level errors occurs due to previously known action and thus their kind can be predicted. */ /* exception_ce = amqp_channel_exception_class_entry; */ break; } break; /* Default for the above switch should be handled by the below default. */ default: exception_ce = amqp_exception_class_entry; break; } zend_throw_exception(exception_ce, message, code); } void php_amqp_maybe_release_buffers_on_channel( amqp_connection_resource *connection_resource, amqp_channel_resource *channel_resource ) { assert(channel_resource != NULL); assert(channel_resource->channel_id > 0); if (connection_resource) { amqp_maybe_release_buffers_on_channel(connection_resource->connection_state, channel_resource->channel_id); } } amqp-2.1.2/amqp_basic_properties.c0000644000076500000240000006744214553444052016763 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "zend_exceptions.h" #include "Zend/zend_interfaces.h" #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #else #include #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #include #endif #if HAVE_INTTYPES_H #include #endif #include "amqp_basic_properties.h" #include "php_amqp.h" #include "amqp_timestamp.h" #include "amqp_decimal.h" void php_amqp_basic_properties_table_to_zval_internal(amqp_table_t *table, zval *result, zend_ulong depth); void php_amqp_basic_properties_array_to_zval_internal(amqp_array_t *array, zval *result, zend_ulong depth); bool php_amqp_basic_properties_value_to_zval_internal(amqp_field_value_t *value, zval *result, zend_ulong depth); zend_class_entry *amqp_basic_properties_class_entry; #define this_ce amqp_basic_properties_class_entry void php_amqp_basic_properties_to_zval(amqp_basic_properties_t *props, zval *obj) { object_init_ex(obj, this_ce); php_amqp_basic_properties_extract(props, obj); } void php_amqp_basic_properties_set_empty_headers(zval *obj) { zval headers; ZVAL_UNDEF(&headers); array_init(&headers); zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("headers"), &headers); zval_ptr_dtor(&headers); } /* {{{ proto AMQPBasicProperties::__construct() */ static PHP_METHOD(AMQPBasicProperties, __construct) { char *content_type = NULL; size_t content_type_len = 0; char *content_encoding = NULL; size_t content_encoding_len = 0; zval *headers = NULL; zend_long delivery_mode = AMQP_DELIVERY_NONPERSISTENT; zend_long priority = 0; char *correlation_id = NULL; size_t correlation_id_len = 0; char *reply_to = NULL; size_t reply_to_len = 0; char *expiration = NULL; size_t expiration_len = 0; char *message_id = NULL; size_t message_id_len = 0; zend_long timestamp = 0; bool timestamp_is_null = 1; char *type = NULL; size_t type_len = 0; char *user_id = NULL; size_t user_id_len = 0; char *app_id = NULL; size_t app_id_len = 0; char *cluster_id = NULL; size_t cluster_id_len = 0; if (zend_parse_parameters( ZEND_NUM_ARGS(), "|s!s!alls!s!s!s!l!s!s!s!s!", /* s */ &content_type, &content_type_len, /* s */ &content_encoding, &content_encoding_len, /* a */ &headers, /* l */ &delivery_mode, /* l */ &priority, /* s */ &correlation_id, &correlation_id_len, /* s */ &reply_to, &reply_to_len, /* s */ &expiration, &expiration_len, /* s */ &message_id, &message_id_len, /* l */ ×tamp, ×tamp_is_null, /* s */ &type, &type_len, /* s */ &user_id, &user_id_len, /* s */ &app_id, &app_id_len, /* s */ &cluster_id, &cluster_id_len ) == FAILURE) { RETURN_THROWS(); } if (content_type != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("contentType"), content_type, content_type_len ); } if (content_encoding != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("contentEncoding"), content_encoding, content_encoding_len ); } if (headers != NULL) { zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("headers"), headers); } else { php_amqp_basic_properties_set_empty_headers(getThis()); } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("deliveryMode"), delivery_mode); zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("priority"), priority); if (correlation_id != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("correlationId"), correlation_id, correlation_id_len ); } if (reply_to != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("replyTo"), reply_to, reply_to_len ); } if (expiration != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("expiration"), expiration, expiration_len ); } if (message_id != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("messageId"), message_id, message_id_len ); } if (!timestamp_is_null) { zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("timestamp"), timestamp); } if (type != NULL) { zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("type"), type, type_len); } if (user_id != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("userId"), user_id, user_id_len ); } if (app_id != NULL) { zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("appId"), app_id, app_id_len); } if (cluster_id != NULL) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("clusterId"), cluster_id, cluster_id_len ); } } /* }}} */ /* {{{ proto AMQPBasicProperties::getContentType() */ static PHP_METHOD(AMQPBasicProperties, getContentType) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("contentType"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getContentEncoding() */ static PHP_METHOD(AMQPBasicProperties, getContentEncoding) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("contentEncoding"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getHeaders() */ static PHP_METHOD(AMQPBasicProperties, getHeaders) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("headers"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getDeliveryMode() */ static PHP_METHOD(AMQPBasicProperties, getDeliveryMode) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("deliveryMode"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getPriority() */ static PHP_METHOD(AMQPBasicProperties, getPriority) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("priority"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getCorrelationId() */ static PHP_METHOD(AMQPBasicProperties, getCorrelationId) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("correlationId"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getReplyTo() */ static PHP_METHOD(AMQPBasicProperties, getReplyTo) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("replyTo"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getExpiration() check amqp envelope */ static PHP_METHOD(AMQPBasicProperties, getExpiration) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("expiration"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getMessageId() */ static PHP_METHOD(AMQPBasicProperties, getMessageId) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("messageId"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getTimestamp() */ static PHP_METHOD(AMQPBasicProperties, getTimestamp) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("timestamp"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getType() */ static PHP_METHOD(AMQPBasicProperties, getType) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("type"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getUserId() */ static PHP_METHOD(AMQPBasicProperties, getUserId) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("userId"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getAppId() */ static PHP_METHOD(AMQPBasicProperties, getAppId) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("appId"); } /* }}} */ /* {{{ proto AMQPBasicProperties::getClusterId() */ static PHP_METHOD(AMQPBasicProperties, getClusterId) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("clusterId"); } /* }}} */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_basic_properties_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, contentType, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, contentEncoding, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, headers, IS_ARRAY, 0, "[]") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, deliveryMode, IS_LONG, 0, "AMQP_DELIVERY_MODE_TRANSIENT") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, priority, IS_LONG, 0, "0") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, correlationId, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, replyTo, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, expiration, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, messageId, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timestamp, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, type, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, userId, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, appId, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, clusterId, IS_STRING, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getContentType, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getContentEncoding, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getHeaders, ZEND_SEND_BY_VAL, 0, IS_ARRAY, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getDeliveryMode, ZEND_SEND_BY_VAL, 0, IS_LONG, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getPriority, ZEND_SEND_BY_VAL, 0, IS_LONG, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getCorrelationId, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getReplyTo, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getExpiration, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getMessageId, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getTimestamp, ZEND_SEND_BY_VAL, 0, IS_LONG, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_basic_properties_class_getType, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getUserId, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_basic_properties_class_getAppId, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_basic_properties_class_getClusterId, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() zend_function_entry amqp_basic_properties_class_functions[] = { PHP_ME(AMQPBasicProperties, __construct, arginfo_amqp_basic_properties_class__construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) PHP_ME(AMQPBasicProperties, getContentType, arginfo_amqp_basic_properties_class_getContentType, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getContentEncoding, arginfo_amqp_basic_properties_class_getContentEncoding, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getHeaders, arginfo_amqp_basic_properties_class_getHeaders, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getDeliveryMode, arginfo_amqp_basic_properties_class_getDeliveryMode, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getPriority, arginfo_amqp_basic_properties_class_getPriority, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getCorrelationId, arginfo_amqp_basic_properties_class_getCorrelationId, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getReplyTo, arginfo_amqp_basic_properties_class_getReplyTo, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getExpiration, arginfo_amqp_basic_properties_class_getExpiration, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getMessageId, arginfo_amqp_basic_properties_class_getMessageId, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getTimestamp, arginfo_amqp_basic_properties_class_getTimestamp, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getType, arginfo_amqp_basic_properties_class_getType, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getUserId, arginfo_amqp_basic_properties_class_getUserId, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getAppId, arginfo_amqp_basic_properties_class_getAppId, ZEND_ACC_PUBLIC) PHP_ME(AMQPBasicProperties, getClusterId, arginfo_amqp_basic_properties_class_getClusterId, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; #define PHP_AMQP_ZVAL_AMQP_DELIVERY_NONPERSISTENT(v) ZVAL_LONG(v, AMQP_DELIVERY_NONPERSISTENT) PHP_MINIT_FUNCTION(amqp_basic_properties) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPBasicProperties", amqp_basic_properties_class_functions); this_ce = zend_register_internal_class(&ce); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "contentType", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "contentEncoding", ZEND_ACC_PRIVATE, IS_STRING, 1); #if PHP_VERSION_ID >= 80000 PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "headers", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_EMPTY_ARRAY); #else PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "headers", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_NULL); #endif PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT( this_ce, "deliveryMode", ZEND_ACC_PRIVATE, IS_LONG, 0, PHP_AMQP_ZVAL_AMQP_DELIVERY_NONPERSISTENT ); zval default_priority; ZVAL_LONG(&default_priority, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY_ZVAL( this_ce, "priority", ZEND_ACC_PRIVATE, PHP_AMQP_DECLARE_PROPERTY_TYPE(IS_LONG, 0), default_priority ); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "correlationId", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "replyTo", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "expiration", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "messageId", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "timestamp", ZEND_ACC_PRIVATE, IS_LONG, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "type", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "userId", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "appId", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "clusterId", ZEND_ACC_PRIVATE, IS_STRING, 1); return SUCCESS; } bool php_amqp_basic_properties_value_to_zval_internal(amqp_field_value_t *value, zval *result, zend_ulong depth) { if (depth > PHP_AMQP_G(deserialization_depth)) { zend_throw_exception_ex( amqp_exception_class_entry, 0, "Maximum deserialization depth limit of %ld reached while deserializing value", PHP_AMQP_G(deserialization_depth) ); return 0; } switch (value->kind) { case AMQP_FIELD_KIND_BOOLEAN: ZVAL_BOOL(result, value->value.boolean); break; case AMQP_FIELD_KIND_I8: ZVAL_LONG(result, value->value.i8); break; case AMQP_FIELD_KIND_U8: ZVAL_LONG(result, value->value.u8); break; case AMQP_FIELD_KIND_I16: ZVAL_LONG(result, value->value.i16); break; case AMQP_FIELD_KIND_U16: ZVAL_LONG(result, value->value.u16); break; case AMQP_FIELD_KIND_I32: ZVAL_LONG(result, value->value.i32); break; case AMQP_FIELD_KIND_U32: ZVAL_LONG(result, value->value.u32); break; case AMQP_FIELD_KIND_I64: ZVAL_LONG(result, value->value.i64); break; case AMQP_FIELD_KIND_U64: if (value->value.u64 > LONG_MAX) { ZVAL_DOUBLE(result, value->value.u64); } else { ZVAL_LONG(result, value->value.u64); } break; case AMQP_FIELD_KIND_F32: ZVAL_DOUBLE(result, value->value.f32); break; case AMQP_FIELD_KIND_F64: ZVAL_DOUBLE(result, value->value.f64); break; case AMQP_FIELD_KIND_UTF8: case AMQP_FIELD_KIND_BYTES: ZVAL_STRINGL(result, value->value.bytes.bytes, value->value.bytes.len); break; case AMQP_FIELD_KIND_VOID: ZVAL_NULL(result); break; case AMQP_FIELD_KIND_ARRAY: array_init(result); php_amqp_basic_properties_array_to_zval_internal(&(value->value.array), result, depth); break; case AMQP_FIELD_KIND_TABLE: array_init(result); php_amqp_basic_properties_table_to_zval_internal(&(value->value.table), result, depth); break; case AMQP_FIELD_KIND_TIMESTAMP: { zval timestamp; ZVAL_UNDEF(×tamp); ZVAL_DOUBLE(×tamp, value->value.u64); object_init_ex(result, amqp_timestamp_class_entry); zend_call_method_with_1_params( PHP_AMQP_COMPAT_OBJ_P(result), amqp_timestamp_class_entry, NULL, "__construct", NULL, ×tamp ); break; } case AMQP_FIELD_KIND_DECIMAL: { zval e; zval n; ZVAL_UNDEF(&e); ZVAL_UNDEF(&n); ZVAL_LONG(&e, value->value.decimal.decimals); ZVAL_LONG(&n, value->value.decimal.value); object_init_ex(result, amqp_decimal_class_entry); zend_call_method_with_2_params( PHP_AMQP_COMPAT_OBJ_P(result), amqp_decimal_class_entry, NULL, "__construct", NULL, &e, &n ); zval_ptr_dtor(&e); zval_ptr_dtor(&n); break; } default: return 0; } return 1; } void php_amqp_basic_properties_array_to_zval_internal(amqp_array_t *array, zval *result, zend_ulong depth) { assert(Z_TYPE_P(result) == IS_ARRAY); int i; for (i = 0; i < array->num_entries; ++i) { zval result_nested; ZVAL_UNDEF(&result_nested); if (php_amqp_basic_properties_value_to_zval_internal(&(array->entries[i]), &result_nested, depth + 1)) { add_next_index_zval(result, &result_nested); } else if (!Z_ISUNDEF(result_nested)) { zval_ptr_dtor(&result_nested); } } } void php_amqp_basic_properties_table_to_zval_internal(amqp_table_t *table, zval *result, zend_ulong depth) { int i; zval result_nested; assert(Z_TYPE_P(result) == IS_ARRAY); for (i = 0; i < table->num_entries; ++i) { amqp_table_entry_t *entry = &(table->entries[i]); ZVAL_UNDEF(&result_nested); if (php_amqp_basic_properties_value_to_zval_internal(&(entry->value), &result_nested, depth + 1)) { char *key = estrndup(entry->key.bytes, (unsigned) entry->key.len); add_assoc_zval(result, key, &result_nested); efree(key); } else if (!Z_ISUNDEF(result_nested)) { zval_ptr_dtor(&result_nested); } } } void php_amqp_basic_properties_extract(amqp_basic_properties_t *props, zval *obj) { zval headers; ZVAL_UNDEF(&headers); array_init(&headers); if (props->_flags & AMQP_BASIC_CONTENT_TYPE_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("contentType"), (const char *) props->content_type.bytes, (size_t) props->content_type.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("contentType")); } if (props->_flags & AMQP_BASIC_CONTENT_ENCODING_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("contentEncoding"), (const char *) props->content_encoding.bytes, (size_t) props->content_encoding.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("contentEncoding")); } if (props->_flags & AMQP_BASIC_HEADERS_FLAG) { php_amqp_basic_properties_table_to_zval_internal(&(props->headers), &headers, 0); } zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("headers"), &headers); if (props->_flags & AMQP_BASIC_DELIVERY_MODE_FLAG) { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("deliveryMode"), (zend_long) props->delivery_mode ); } else { /* BC */ zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("deliveryMode"), AMQP_DELIVERY_NONPERSISTENT ); } if (props->_flags & AMQP_BASIC_PRIORITY_FLAG) { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("priority"), (zend_long) props->priority ); } else { /* BC */ zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("priority"), 0); } if (props->_flags & AMQP_BASIC_CORRELATION_ID_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("correlationId"), (const char *) props->correlation_id.bytes, (size_t) props->correlation_id.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("correlationId")); } if (props->_flags & AMQP_BASIC_REPLY_TO_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("replyTo"), (const char *) props->reply_to.bytes, (size_t) props->reply_to.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("replyTo")); } if (props->_flags & AMQP_BASIC_EXPIRATION_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("expiration"), (const char *) props->expiration.bytes, (size_t) props->expiration.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("expiration")); } if (props->_flags & AMQP_BASIC_MESSAGE_ID_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("messageId"), (const char *) props->message_id.bytes, (size_t) props->message_id.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("messageId")); } if (props->_flags & AMQP_BASIC_TIMESTAMP_FLAG) { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("timestamp"), (zend_long) props->timestamp ); } else { /* BC */ zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("timestamp"), 0); } if (props->_flags & AMQP_BASIC_TYPE_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("type"), (const char *) props->type.bytes, (size_t) props->type.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("type")); } if (props->_flags & AMQP_BASIC_USER_ID_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("userId"), (const char *) props->user_id.bytes, (size_t) props->user_id.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("userId")); } if (props->_flags & AMQP_BASIC_APP_ID_FLAG) { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("appId"), (const char *) props->app_id.bytes, (size_t) props->app_id.len ); } else { /* BC */ zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL("appId")); } zval_ptr_dtor(&headers); } amqp-2.1.2/amqp_basic_properties.h0000644000076500000240000000352714553444052016762 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" #include "php_amqp.h" extern zend_class_entry *amqp_basic_properties_class_entry; void php_amqp_basic_properties_extract(amqp_basic_properties_t *props, zval *obj); void php_amqp_basic_properties_to_zval(amqp_basic_properties_t *props, zval *obj); void php_amqp_basic_properties_set_empty_headers(zval *obj); PHP_MINIT_FUNCTION(amqp_basic_properties); amqp-2.1.2/amqp_channel.c0000644000076500000240000015445714553444052015041 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #else #include #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif #include "php_amqp.h" #include "amqp_connection.h" #include "amqp_methods_handling.h" #include "amqp_connection_resource.h" #include "amqp_channel.h" zend_class_entry *amqp_channel_class_entry; #define this_ce amqp_channel_class_entry zend_object_handlers amqp_channel_object_handlers; void php_amqp_close_channel(amqp_channel_resource *channel_resource, bool throw) { assert(channel_resource != NULL); amqp_connection_resource *connection_resource = channel_resource->connection_resource; if (connection_resource != NULL) { /* First, remove it from active channels table to prevent recursion in case of connection error */ php_amqp_connection_resource_unregister_channel(connection_resource, channel_resource->channel_id); } else { channel_resource->is_connected = '\0'; } assert(channel_resource->connection_resource == NULL); if (!channel_resource->is_connected) { /* Nothing to do more - channel was previously marked as closed, possibly, due to channel-level error */ return; } channel_resource->is_connected = '\0'; if (connection_resource && connection_resource->is_connected && channel_resource->channel_id > 0) { assert(connection_resource != NULL); amqp_rpc_reply_t close_res = amqp_channel_close(connection_resource->connection_state, channel_resource->channel_id, AMQP_REPLY_SUCCESS); if (throw && PHP_AMQP_MAYBE_ERROR(close_res, channel_resource)) { php_amqp_zend_throw_exception_short(close_res, amqp_channel_exception_class_entry); goto err; } if (close_res.reply_type != AMQP_RESPONSE_NORMAL) { goto err; } amqp_rpc_reply_t reply_res = amqp_get_rpc_reply(connection_resource->connection_state); if (throw && PHP_AMQP_MAYBE_ERROR(reply_res, channel_resource)) { php_amqp_zend_throw_exception_short(reply_res, amqp_channel_exception_class_entry); goto err; } if (reply_res.reply_type != AMQP_RESPONSE_NORMAL) { goto err; } php_amqp_maybe_release_buffers_on_channel(connection_resource, channel_resource); return; err: // Mark failed slot as used connection_resource->used_slots++; return; } } static void php_amqp_destroy_fci(zend_fcall_info *fci) { if (fci->size > 0) { zval_ptr_dtor(&fci->function_name); if (fci->object != NULL) { GC_DELREF(fci->object); } fci->size = 0; } } static void php_amqp_duplicate_fci(zend_fcall_info *source) { if (source->size > 0) { zval_add_ref(&source->function_name); if (source->object != NULL) { GC_ADDREF(source->object); } } } static int php_amqp_get_fci_gc_data_count(zend_fcall_info *fci) { int cnt = 0; if (fci->size > 0) { cnt++; if (fci->object != NULL) { cnt++; } } return cnt; } static zval *php_amqp_get_fci_gc_data(zend_fcall_info *fci, zval *gc_data) { if (ZEND_FCI_INITIALIZED(*fci)) { ZVAL_COPY_VALUE(gc_data++, &fci->function_name); if (fci->object != NULL) { ZVAL_OBJ(gc_data++, fci->object); } } return gc_data; } #if PHP_MAJOR_VERSION < 8 static HashTable *amqp_channel_gc(zval *object, zval **table, int *n) /* {{{ */ { amqp_channel_object *channel = PHP_AMQP_GET_CHANNEL(object); #else static HashTable *amqp_channel_gc(zend_object *object, zval **table, int *n) /* {{{ */ { amqp_channel_object *channel = php_amqp_channel_object_fetch(object); #endif int basic_return_cnt = php_amqp_get_fci_gc_data_count(&channel->callbacks.basic_return.fci); int basic_ack_cnt = php_amqp_get_fci_gc_data_count(&channel->callbacks.basic_ack.fci); int basic_nack_cnt = php_amqp_get_fci_gc_data_count(&channel->callbacks.basic_nack.fci); int cnt = basic_return_cnt + basic_ack_cnt + basic_nack_cnt; if (cnt > channel->gc_data_count) { channel->gc_data_count = cnt; channel->gc_data = (zval *) erealloc(channel->gc_data, sizeof(zval) * cnt); } zval *gc_data = channel->gc_data; gc_data = php_amqp_get_fci_gc_data(&channel->callbacks.basic_return.fci, gc_data); gc_data = php_amqp_get_fci_gc_data(&channel->callbacks.basic_ack.fci, gc_data); php_amqp_get_fci_gc_data(&channel->callbacks.basic_nack.fci, gc_data); *table = channel->gc_data; *n = cnt; return zend_std_get_properties(object); } /* }}} */ static void php_amqp_clean_callbacks(amqp_channel_callbacks *callbacks) { php_amqp_destroy_fci(&callbacks->basic_return.fci); php_amqp_destroy_fci(&callbacks->basic_ack.fci); php_amqp_destroy_fci(&callbacks->basic_nack.fci); } void amqp_channel_free(zend_object *object) { amqp_channel_object *channel = PHP_AMQP_FETCH_CHANNEL(object); if (channel->channel_resource != NULL) { php_amqp_close_channel(channel->channel_resource, 0); efree(channel->channel_resource); channel->channel_resource = NULL; } if (channel->gc_data) { efree(channel->gc_data); } php_amqp_clean_callbacks(&channel->callbacks); zend_object_std_dtor(&channel->zo); } zend_object *amqp_channel_ctor(zend_class_entry *ce) { amqp_channel_object *channel = (amqp_channel_object *) ecalloc(1, sizeof(amqp_channel_object) + zend_object_properties_size(ce)); zend_object_std_init(&channel->zo, ce); AMQP_OBJECT_PROPERTIES_INIT(channel->zo, ce); #if PHP_MAJOR_VERSION >= 7 channel->zo.handlers = &amqp_channel_object_handlers; return &channel->zo; #else zend_object *new_value; new_value.handle = zend_objects_store_put(channel, NULL, (zend_objects_free_object_storage_t) amqp_channel_free, NULL); new_value.handlers = zend_get_std_object_handlers(); return new_value; #endif } /* {{{ proto AMQPChannel::__construct(AMQPConnection obj) */ static PHP_METHOD(amqp_channel_class, __construct) { zval rv; zval *connection_object = NULL; amqp_channel_resource *channel_resource; amqp_channel_object *channel; amqp_connection_object *connection; /* Parse out the method parameters */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &connection_object, amqp_connection_class_entry) == FAILURE) { zend_throw_exception(amqp_channel_exception_class_entry, "Parameter must be an instance of AMQPConnection.", 0); RETURN_NULL(); } zval consumers; ZVAL_UNDEF(&consumers); array_init(&consumers); zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("consumers"), &consumers); zval_ptr_dtor(&consumers); channel = PHP_AMQP_GET_CHANNEL(getThis()); /* Set the prefetch count */ zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchCount"), INI_INT("amqp.prefetch_count") ); /* Set the prefetch size */ zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchSize"), INI_INT("amqp.prefetch_size") ); /* Set the global prefetch count */ zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchCount"), INI_INT("amqp.global_prefetch_count") ); /* Set the global prefetch size */ zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchSize"), INI_INT("amqp.global_prefetch_size") ); /* Pull out and verify the connection */ connection = PHP_AMQP_GET_CONNECTION(connection_object); PHP_AMQP_VERIFY_CONNECTION(connection, "Could not create channel."); if (!connection->connection_resource) { zend_throw_exception( amqp_channel_exception_class_entry, "Could not create channel. No connection resource.", 0 ); RETURN_THROWS(); } if (!connection->connection_resource->is_connected) { zend_throw_exception( amqp_channel_exception_class_entry, "Could not create channel. Connection resource is not connected.", 0 ); return; } zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connection"), connection_object); channel_resource = (amqp_channel_resource *) ecalloc(1, sizeof(amqp_channel_resource)); channel->channel_resource = channel_resource; channel_resource->parent = channel; /* Figure out what the next available channel is on this connection */ channel_resource->channel_id = php_amqp_connection_resource_get_available_channel_id(connection->connection_resource); /* Check that we got a valid channel */ if (!channel_resource->channel_id) { zend_throw_exception( amqp_channel_exception_class_entry, "Could not create channel. Connection has no open channel slots remaining.", 0 ); return; } if (php_amqp_connection_resource_register_channel( connection->connection_resource, channel_resource, channel_resource->channel_id ) == FAILURE) { zend_throw_exception( amqp_channel_exception_class_entry, "Could not create channel. Failed to add channel to connection slot.", 0 ); } /* Open up the channel for use */ amqp_channel_open_ok_t *r = amqp_channel_open(channel_resource->connection_resource->connection_state, channel_resource->channel_id); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_channel_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); /* Prevent double free, it may happen in case the channel resource was already freed due to some hard error. */ if (channel_resource->connection_resource) { php_amqp_connection_resource_unregister_channel( channel_resource->connection_resource, channel_resource->channel_id ); channel_resource->channel_id = 0; } return; } /* r->channel_id is a 16-bit channel number inside amqp_bytes_t, assertion below will without converting to uint16_t*/ /* assert (r->channel_id == channel_resource->channel_id);*/ php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); channel_resource->is_connected = '\1'; /* Set the prefetch count: */ amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, 0, /* prefetch window size */ (uint16_t) PHP_AMQP_READ_THIS_PROP_LONG("prefetchCount"), /* prefetch message count */ /* NOTE that RabbitMQ has reinterpreted global flag field. See https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.qos.global for details */ 0 /* global flag */ ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); uint32_t global_prefetch_size = (uint32_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchSize"); uint16_t global_prefetch_count = (uint16_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchCount"); /* Set the global prefetch settings (ignoring if 0 for backwards compatibility) */ if (global_prefetch_size != 0 || global_prefetch_count != 0) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, global_prefetch_size, global_prefetch_count, 1 ); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } } /* }}} */ /* {{{ proto bool amqp::isConnected() check amqp channel */ static PHP_METHOD(amqp_channel_class, isConnected) { amqp_channel_resource *channel_resource; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); RETURN_BOOL(channel_resource && channel_resource->is_connected); } /* }}} */ /* {{{ proto bool AMQPChannel::close() Close amqp channel */ static PHP_METHOD(amqp_channel_class, close) { amqp_channel_resource *channel_resource; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); if (channel_resource && channel_resource->is_connected) { php_amqp_close_channel(channel_resource, 1); } } /* }}} */ /* {{{ proto bool amqp::getChannelId() get amqp channel ID */ static PHP_METHOD(amqp_channel_class, getChannelId) { amqp_channel_resource *channel_resource; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); if (!channel_resource) { RETURN_NULL(); } RETURN_LONG(channel_resource->channel_id); } /* }}} */ /* {{{ proto bool amqp::setPrefetchCount(long count) set the number of prefetches */ static PHP_METHOD(amqp_channel_class, setPrefetchCount) { zval rv; amqp_channel_resource *channel_resource; zend_long prefetch_count; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &prefetch_count) == FAILURE) { RETURN_THROWS(); } if (!php_amqp_is_valid_prefetch_count(prefetch_count)) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'prefetchCount' must be between 0 and %u.", PHP_AMQP_MAX_PREFETCH_COUNT ); return; } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_CONNECTION_RESOURCE(channel_resource, "Could not set prefetch count."); // TODO: verify that connection is active and resource exists. that is enough /* If we are already connected, set the new prefetch count */ if (channel_resource->is_connected) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, 0, (uint16_t) prefetch_count, 0 ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); uint32_t global_prefetch_size = (uint32_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchSize"); uint16_t global_prefetch_count = (uint16_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchCount"); /* Re-apply current global prefetch settings if set (writing consumer prefetch settings will clear global prefetch settings) */ if (global_prefetch_size != 0 || global_prefetch_count != 0) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, global_prefetch_size, global_prefetch_count, 1 ); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } } /* Set the prefetch count - the implication is to disable the size */ zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchCount"), prefetch_count); zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchSize"), 0); } /* }}} */ /* {{{ proto long amqp::getPrefetchCount() get the number of prefetches */ static PHP_METHOD(amqp_channel_class, getPrefetchCount) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("prefetchCount") } /* }}} */ /* {{{ proto bool amqp::setPrefetchSize(long size) set the number of prefetches */ static PHP_METHOD(amqp_channel_class, setPrefetchSize) { zval rv; amqp_channel_resource *channel_resource; zend_long prefetch_size; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &prefetch_size) == FAILURE) { RETURN_THROWS(); } if (!php_amqp_is_valid_prefetch_size(prefetch_size)) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'prefetchSize' must be between 0 and %u.", PHP_AMQP_MAX_PREFETCH_SIZE ); return; } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_CONNECTION_RESOURCE(channel_resource, "Could not set prefetch size."); /* If we are already connected, set the new prefetch count */ if (channel_resource->is_connected) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (uint32_t) prefetch_size, 0, 0 ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); uint32_t global_prefetch_size = (uint32_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchSize"); uint16_t global_prefetch_count = (uint16_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchCount"); /* Re-apply current global prefetch settings if set (writing consumer prefetch settings will clear global prefetch settings) */ if (global_prefetch_size != 0 || global_prefetch_count != 0) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, global_prefetch_size, global_prefetch_count, 1 ); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } } /* Set the prefetch size - the implication is to disable the count */ zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchCount"), 0); zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchSize"), prefetch_size); } /* }}} */ /* {{{ proto long amqp::getPrefetchSize() get the number of prefetches */ static PHP_METHOD(amqp_channel_class, getPrefetchSize) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("prefetchSize") } /* }}} */ /* {{{ proto bool amqp::setGlobalPrefetchCount(long count) set the number of prefetches */ static PHP_METHOD(amqp_channel_class, setGlobalPrefetchCount) { amqp_channel_resource *channel_resource; zend_long global_prefetch_count; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &global_prefetch_count) == FAILURE) { RETURN_THROWS(); } if (!php_amqp_is_valid_prefetch_count(global_prefetch_count)) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'globalPrefetchCount' must be between 0 and %u.", PHP_AMQP_MAX_PREFETCH_COUNT ); return; } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_CONNECTION_RESOURCE(channel_resource, "Could not set global prefetch count."); /* If we are already connected, set the new prefetch count */ if (channel_resource->is_connected) { /* Applying global prefetch settings retains existing consumer prefetch settings */ amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, 0, (uint16_t) global_prefetch_count, 1 ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* Set the global prefetch count - the implication is to disable the size */ zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchCount"), global_prefetch_count ); zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchSize"), 0); } /* }}} */ /* {{{ proto long amqp::getGlobalPrefetchCount() get the number of prefetches */ static PHP_METHOD(amqp_channel_class, getGlobalPrefetchCount) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("globalPrefetchCount") } /* }}} */ /* {{{ proto bool amqp::setGlobalPrefetchSize(long size) set the number of prefetches */ static PHP_METHOD(amqp_channel_class, setGlobalPrefetchSize) { amqp_channel_resource *channel_resource; zend_long global_prefetch_size; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &global_prefetch_size) == FAILURE) { RETURN_THROWS(); } if (!php_amqp_is_valid_prefetch_size(global_prefetch_size)) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'globalPrefetchSize' must be between 0 and %u.", PHP_AMQP_MAX_PREFETCH_SIZE ); return; } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_CONNECTION_RESOURCE(channel_resource, "Could not set prefetch size."); /* If we are already connected, set the new prefetch count */ if (channel_resource->is_connected) { /* Applying global prefetch settings retains existing consumer prefetch settings */ amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (uint32_t) global_prefetch_size, 0, 1 ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* Set the global prefetch size - the implication is to disable the count */ zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchCount"), 0); zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchSize"), global_prefetch_size ); } /* }}} */ /* {{{ proto long amqp::getGlobalPrefetchSize() get the number of prefetches */ static PHP_METHOD(amqp_channel_class, getGlobalPrefetchSize) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("globalPrefetchSize") } /* }}} */ /* {{{ proto amqp::qos(long size, long count, bool global) set the number of prefetches */ static PHP_METHOD(amqp_channel_class, qos) { zval rv; amqp_channel_resource *channel_resource; zend_long prefetch_size; zend_long prefetch_count; bool global = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll|b", &prefetch_size, &prefetch_count, &global) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_CONNECTION_RESOURCE(channel_resource, "Could not set qos parameters."); /* Set the prefetch size and prefetch count */ if (global) { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchSize"), prefetch_size ); zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("globalPrefetchCount"), prefetch_count ); } else { zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchSize"), prefetch_size); zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("prefetchCount"), prefetch_count ); } /* If we are already connected, set the new prefetch count */ if (channel_resource->is_connected) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (uint32_t) PHP_AMQP_READ_THIS_PROP_LONG("prefetchSize"), (uint16_t) PHP_AMQP_READ_THIS_PROP_LONG("prefetchCount"), /* NOTE that RabbitMQ has reinterpreted global flag field. See https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.qos.global for details */ 0 /* Global flag - whether this change should affect every channel_resource */ ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); uint32_t global_prefetch_size = (uint32_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchSize"); uint16_t global_prefetch_count = (uint16_t) PHP_AMQP_READ_THIS_PROP_LONG("globalPrefetchCount"); /* Re-apply current global prefetch settings if set (writing consumer prefetch settings will clear global prefetch settings) */ if (global_prefetch_size != 0 || global_prefetch_count != 0) { amqp_basic_qos( channel_resource->connection_resource->connection_state, channel_resource->channel_id, global_prefetch_size, global_prefetch_count, 1 ); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } } } /* }}} */ /* {{{ proto amqp::startTransaction() start a transaction on the given channel */ static PHP_METHOD(amqp_channel_class, startTransaction) { amqp_channel_resource *channel_resource; amqp_rpc_reply_t res; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not start the transaction."); amqp_tx_select(channel_resource->connection_resource->connection_state, channel_resource->channel_id); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto amqp::startTransaction() start a transaction on the given channel */ static PHP_METHOD(amqp_channel_class, commitTransaction) { amqp_channel_resource *channel_resource; amqp_rpc_reply_t res; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not start the transaction."); amqp_tx_commit(channel_resource->connection_resource->connection_state, channel_resource->channel_id); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto amqp::startTransaction() start a transaction on the given channel */ static PHP_METHOD(amqp_channel_class, rollbackTransaction) { amqp_channel_resource *channel_resource; amqp_rpc_reply_t res; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not rollback the transaction."); amqp_tx_rollback(channel_resource->connection_resource->connection_state, channel_resource->channel_id); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto AMQPChannel::getConnection() Get the AMQPConnection object in use */ static PHP_METHOD(amqp_channel_class, getConnection) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("connection") } /* }}} */ /* {{{ proto bool amqp::basicRecover([bool requeue=TRUE]) Redeliver unacknowledged messages */ static PHP_METHOD(amqp_channel_class, basicRecover) { amqp_channel_resource *channel_resource; amqp_rpc_reply_t res; bool requeue = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &requeue) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not redeliver unacknowledged messages."); amqp_basic_recover( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (amqp_boolean_t) requeue ); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto bool amqp::confirmSelect() Redeliver unacknowledged messages */ PHP_METHOD(amqp_channel_class, confirmSelect) { amqp_channel_resource *channel_resource; amqp_rpc_reply_t res; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(getThis()); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not enable confirms mode."); amqp_confirm_select(channel_resource->connection_resource->connection_state, channel_resource->channel_id); res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_channel_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto bool AMQPChannel::setReturnCallback(callable return_callback) Set callback for basic.return server method handling */ PHP_METHOD(amqp_channel_class, setReturnCallback) { zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fcc = empty_fcall_info_cache; if (zend_parse_parameters(ZEND_NUM_ARGS(), "f!", &fci, &fcc) == FAILURE) { RETURN_THROWS(); } amqp_channel_object *channel = PHP_AMQP_GET_CHANNEL(getThis()); php_amqp_destroy_fci(&channel->callbacks.basic_return.fci); if (ZEND_FCI_INITIALIZED(fci)) { php_amqp_duplicate_fci(&fci); channel->callbacks.basic_return.fci = fci; channel->callbacks.basic_return.fcc = fcc; } } /* }}} */ /* {{{ proto bool AMQPChannel::waitForBasicReturn([double timeout=0.0]) Wait for basic.return method from server */ PHP_METHOD(amqp_channel_class, waitForBasicReturn) { amqp_channel_object *channel; amqp_channel_resource *channel_resource; amqp_method_t method; int status; double timeout = 0; struct timeval tv = {0}; struct timeval *tv_ptr = &tv; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|d", &timeout) == FAILURE) { RETURN_THROWS(); } if (timeout < 0) { zend_throw_exception(amqp_channel_exception_class_entry, "Timeout must be greater than or equal to zero.", 0); return; } channel = PHP_AMQP_GET_CHANNEL(getThis()); channel_resource = channel->channel_resource; PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not start wait loop for basic.return method."); if (timeout > 0) { tv.tv_sec = (long int) timeout; tv.tv_usec = (long int) ((timeout - tv.tv_sec) * 1000000); } else { tv_ptr = NULL; } assert(channel_resource->channel_id > 0); while (1) { php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); status = amqp_simple_wait_method_noblock( channel_resource->connection_resource->connection_state, channel_resource->channel_id, AMQP_BASIC_RETURN_METHOD, &method, tv_ptr ); if (AMQP_STATUS_TIMEOUT == status) { zend_throw_exception(amqp_queue_exception_class_entry, "Wait timeout exceed", 0); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } if (status != AMQP_STATUS_OK) { /* Emulate library error */ amqp_rpc_reply_t res; if (AMQP_RESPONSE_SERVER_EXCEPTION == status) { res.reply_type = AMQP_RESPONSE_SERVER_EXCEPTION; res.reply = method; } else { res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; } php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } status = php_amqp_handle_basic_return(&PHP_AMQP_G(error_message), channel, &method); if (PHP_AMQP_RESOURCE_RESPONSE_BREAK == status) { php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); break; } if (PHP_AMQP_RESOURCE_RESPONSE_OK != status) { /* Emulate library error */ amqp_rpc_reply_t res; res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_channel_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } } } /* }}} */ /* {{{ proto bool AMQPChannel::setConfirmCallback(callable ack_callback [, callable nack_callback = null]) Set callback for basic.ack and, optionally, basic.nac server methods handling */ PHP_METHOD(amqp_channel_class, setConfirmCallback) { zend_fcall_info ack_fci = empty_fcall_info; zend_fcall_info_cache ack_fcc = empty_fcall_info_cache; zend_fcall_info nack_fci = empty_fcall_info; zend_fcall_info_cache nack_fcc = empty_fcall_info_cache; if (zend_parse_parameters(ZEND_NUM_ARGS(), "f!|f!", &ack_fci, &ack_fcc, &nack_fci, &nack_fcc) == FAILURE) { RETURN_THROWS(); } amqp_channel_object *channel = PHP_AMQP_GET_CHANNEL(getThis()); php_amqp_destroy_fci(&channel->callbacks.basic_ack.fci); if (ZEND_FCI_INITIALIZED(ack_fci)) { php_amqp_duplicate_fci(&ack_fci); channel->callbacks.basic_ack.fci = ack_fci; channel->callbacks.basic_ack.fcc = ack_fcc; } php_amqp_destroy_fci(&channel->callbacks.basic_nack.fci); if (ZEND_FCI_INITIALIZED(nack_fci)) { php_amqp_duplicate_fci(&nack_fci); channel->callbacks.basic_nack.fci = nack_fci; channel->callbacks.basic_nack.fcc = nack_fcc; } } /* }}} */ /* {{{ proto bool amqp::waitForConfirm([double timeout=0.0]) Redeliver unacknowledged messages */ PHP_METHOD(amqp_channel_class, waitForConfirm) { amqp_channel_object *channel; amqp_channel_resource *channel_resource; amqp_method_t method; int status; double timeout = 0; struct timeval tv = {0}; struct timeval *tv_ptr = &tv; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|d", &timeout) == FAILURE) { RETURN_THROWS(); } if (timeout < 0) { zend_throw_exception(amqp_channel_exception_class_entry, "Timeout must be greater than or equal to zero.", 0); return; } channel = PHP_AMQP_GET_CHANNEL(getThis()); channel_resource = channel->channel_resource; PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not start wait loop for basic.return method."); if (timeout > 0) { tv.tv_sec = (long int) timeout; tv.tv_usec = (long int) ((timeout - tv.tv_sec) * 1000000); } else { tv_ptr = NULL; } assert(channel_resource->channel_id > 0); amqp_method_number_t expected_methods[] = {AMQP_BASIC_ACK_METHOD, AMQP_BASIC_NACK_METHOD, AMQP_BASIC_RETURN_METHOD, 0}; while (1) { php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); status = amqp_simple_wait_method_list_noblock( channel_resource->connection_resource->connection_state, channel_resource->channel_id, expected_methods, &method, tv_ptr ); if (AMQP_STATUS_TIMEOUT == status) { zend_throw_exception(amqp_queue_exception_class_entry, "Wait timeout exceed", 0); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } if (status != AMQP_STATUS_OK) { /* Emulate library error */ amqp_rpc_reply_t res; if (AMQP_RESPONSE_SERVER_EXCEPTION == status) { res.reply_type = AMQP_RESPONSE_SERVER_EXCEPTION; res.reply = method; } else { res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; } php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_channel_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } switch (method.id) { case AMQP_BASIC_ACK_METHOD: status = php_amqp_handle_basic_ack(&PHP_AMQP_G(error_message), channel, &method); break; case AMQP_BASIC_NACK_METHOD: status = php_amqp_handle_basic_nack(&PHP_AMQP_G(error_message), channel, &method); break; case AMQP_BASIC_RETURN_METHOD: status = php_amqp_handle_basic_return(&PHP_AMQP_G(error_message), channel, &method); break; default: status = AMQP_STATUS_WRONG_METHOD; } if (PHP_AMQP_RESOURCE_RESPONSE_BREAK == status) { php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); break; } if (PHP_AMQP_RESOURCE_RESPONSE_OK != status) { /* Emulate library error */ amqp_rpc_reply_t res; res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } } } /* }}} */ /* {{{ proto AMQPChannel::getConsumers() */ static PHP_METHOD(amqp_channel_class, getConsumers) { zval rv; PHP_AMQP_NOPARAMS() zval *tmp = zend_read_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("consumers"), 0, &rv); // Return a proper copy, so that the internal consumer map can be safely modified ZVAL_DUP(return_value, tmp); } /* }}} */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_channel_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_OBJ_INFO(0, connection, AMQPConnection, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_isConnected, ZEND_SEND_BY_VAL, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_close, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_getChannelId, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_setPrefetchSize, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_getPrefetchSize, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_setPrefetchCount, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, count, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_getPrefetchCount, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_channel_class_setGlobalPrefetchSize, ZEND_SEND_BY_VAL, 1, IS_VOID, 0 ) ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_channel_class_getGlobalPrefetchSize, ZEND_SEND_BY_VAL, 0, IS_LONG, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_channel_class_setGlobalPrefetchCount, ZEND_SEND_BY_VAL, 1, IS_VOID, 0 ) ZEND_ARG_TYPE_INFO(0, count, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_channel_class_getGlobalPrefetchCount, ZEND_SEND_BY_VAL, 0, IS_LONG, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_qos, ZEND_SEND_BY_VAL, 2, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, count, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, global, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_startTransaction, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_commitTransaction, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_rollbackTransaction, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO(arginfo_amqp_channel_class_getConnection, AMQPConnection, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_basicRecover, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, requeue, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_confirmSelect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_setConfirmCallback, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_CALLABLE_INFO(0, ackCallback, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, nackCallback, IS_CALLABLE, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_waitForConfirm, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 0, "0.0") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_setReturnCallback, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_CALLABLE_INFO(0, returnCallback, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_waitForBasicReturn, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_DOUBLE, 0, "0.0") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_channel_class_getConsumers, ZEND_SEND_BY_VAL, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() zend_function_entry amqp_channel_class_functions[] = { PHP_ME(amqp_channel_class, __construct, arginfo_amqp_channel_class__construct, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, isConnected, arginfo_amqp_channel_class_isConnected, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, close, arginfo_amqp_channel_class_close, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getChannelId, arginfo_amqp_channel_class_getChannelId, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, setPrefetchSize, arginfo_amqp_channel_class_setPrefetchSize, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getPrefetchSize, arginfo_amqp_channel_class_getPrefetchSize, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, setPrefetchCount, arginfo_amqp_channel_class_setPrefetchCount, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getPrefetchCount, arginfo_amqp_channel_class_getPrefetchCount, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, setGlobalPrefetchSize, arginfo_amqp_channel_class_setGlobalPrefetchSize, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getGlobalPrefetchSize, arginfo_amqp_channel_class_getGlobalPrefetchSize, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, setGlobalPrefetchCount, arginfo_amqp_channel_class_setGlobalPrefetchCount, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getGlobalPrefetchCount, arginfo_amqp_channel_class_getGlobalPrefetchCount, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, qos, arginfo_amqp_channel_class_qos, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, startTransaction, arginfo_amqp_channel_class_startTransaction, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, commitTransaction, arginfo_amqp_channel_class_commitTransaction, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, rollbackTransaction, arginfo_amqp_channel_class_rollbackTransaction, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getConnection, arginfo_amqp_channel_class_getConnection, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, basicRecover, arginfo_amqp_channel_class_basicRecover, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, confirmSelect, arginfo_amqp_channel_class_confirmSelect, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, waitForConfirm, arginfo_amqp_channel_class_waitForConfirm, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, setConfirmCallback, arginfo_amqp_channel_class_setConfirmCallback, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, setReturnCallback, arginfo_amqp_channel_class_setReturnCallback, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, waitForBasicReturn, arginfo_amqp_channel_class_waitForBasicReturn, ZEND_ACC_PUBLIC) PHP_ME(amqp_channel_class, getConsumers, arginfo_amqp_channel_class_getConsumers, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_channel) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPChannel", amqp_channel_class_functions); ce.create_object = amqp_channel_ctor; amqp_channel_class_entry = zend_register_internal_class(&ce); PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ(this_ce, "connection", ZEND_ACC_PRIVATE, AMQPConnection, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "prefetchCount", ZEND_ACC_PRIVATE, IS_LONG, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "prefetchSize", ZEND_ACC_PRIVATE, IS_LONG, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "globalPrefetchCount", ZEND_ACC_PRIVATE, IS_LONG, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "globalPrefetchSize", ZEND_ACC_PRIVATE, IS_LONG, 1); #if PHP_VERSION_ID >= 80000 PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "consumers", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_EMPTY_ARRAY); #else PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "consumers", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_NULL); #endif #if PHP_MAJOR_VERSION >= 7 memcpy(&amqp_channel_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); amqp_channel_object_handlers.offset = XtOffsetOf(amqp_channel_object, zo); amqp_channel_object_handlers.free_obj = amqp_channel_free; #endif #if ZEND_MODULE_API_NO >= 20100000 amqp_channel_object_handlers.get_gc = amqp_channel_gc; #endif return SUCCESS; } amqp-2.1.2/amqp_channel.h0000644000076500000240000000323514553444052015031 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_channel_class_entry; void php_amqp_close_channel(amqp_channel_resource *channel_resource, bool throw); PHP_MINIT_FUNCTION(amqp_channel); amqp-2.1.2/amqp_connection.c0000644000076500000240000020551114553444052015554 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #else #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif #include "php_amqp.h" #include "amqp_channel.h" #include "amqp_connection_resource.h" #include "amqp_connection.h" zend_class_entry *amqp_connection_class_entry; #define this_ce amqp_connection_class_entry zend_object_handlers amqp_connection_object_handlers; #define PHP_AMQP_EXTRACT_CONNECTION_STR(name) \ zdata = NULL; \ if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL(name))) != NULL) { \ SEPARATE_ZVAL(zdata); \ convert_to_string(zdata); \ } \ if (zdata && Z_STRLEN_P(zdata) > 0) { \ zend_update_property_string(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL(name), Z_STRVAL_P(zdata)); \ } else if (strlen(INI_STR("amqp." name)) > 0) { \ zend_update_property_string( \ this_ce, \ PHP_AMQP_COMPAT_OBJ_P(getThis()), \ ZEND_STRL(name), \ INI_STR("amqp." name) \ ); \ } #define PHP_AMQP_EXTRACT_CONNECTION_BOOL(name) \ zdata = NULL; \ if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL(name))) != NULL) { \ SEPARATE_ZVAL(zdata); \ convert_to_long(zdata); \ } \ if (zdata) { \ zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL(name), Z_LVAL_P(zdata)); \ } else { \ zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL(name), INI_INT("amqp." name)); \ } static int php_amqp_connection_resource_deleter(zval *el, amqp_connection_resource *connection_resource) { if (Z_RES_P(el)->ptr == connection_resource) { return ZEND_HASH_APPLY_REMOVE | ZEND_HASH_APPLY_STOP; } return ZEND_HASH_APPLY_KEEP; } static size_t php_amqp_get_connection_hash(amqp_connection_params *params, char **hash) { return spprintf( hash, 0, "amqp_conn_res_h:%s_p:%d_v:%s_l:%s_p:%s_f:%d_c:%d_h:%d_cacert:%s_cert:%s_key:%s_sasl_method:%d_connection_name:" "%s", params->host, params->port, params->vhost, params->login, params->password, params->frame_max, params->channel_max, params->heartbeat, params->cacert, params->cert, params->key, params->sasl_method, params->connection_name ); } static void php_amqp_cleanup_connection_resource(amqp_connection_resource *connection_resource) { if (!connection_resource) { return; } zend_resource *resource = connection_resource->resource; connection_resource->parent->connection_resource = NULL; connection_resource->parent = NULL; if (connection_resource->is_dirty) { if (connection_resource->is_persistent) { zend_hash_apply_with_argument( &EG(persistent_list), (apply_func_arg_t) php_amqp_connection_resource_deleter, (void *) connection_resource ); } zend_list_delete(resource); } else { if (connection_resource->is_persistent) { connection_resource->resource = NULL; } if (connection_resource->resource != NULL) { zend_list_delete(resource); } } } static void php_amqp_disconnect(amqp_connection_resource *resource) { php_amqp_prepare_for_disconnect(resource); php_amqp_cleanup_connection_resource(resource); } void php_amqp_disconnect_force(amqp_connection_resource *resource) { php_amqp_prepare_for_disconnect(resource); resource->is_dirty = '\1'; php_amqp_cleanup_connection_resource(resource); } /** * php_amqp_connect * handles connecting to amqp * called by connect(), pconnect(), reconnect(), preconnect() */ int php_amqp_connect(amqp_connection_object *connection, bool persistent, INTERNAL_FUNCTION_PARAMETERS) { zval rv; char *key = NULL; size_t key_len = 0; if (connection->connection_resource) { /* Clean up old memory allocations which are now invalid (new connection) */ php_amqp_cleanup_connection_resource(connection->connection_resource); } assert(connection->connection_resource == NULL); amqp_connection_params connection_params; connection_params.host = PHP_AMQP_READ_THIS_PROP_STR("host"); connection_params.port = (int) PHP_AMQP_READ_THIS_PROP_LONG("port"); connection_params.vhost = PHP_AMQP_READ_THIS_PROP_STR("vhost"); connection_params.login = PHP_AMQP_READ_THIS_PROP_STR("login"); connection_params.password = PHP_AMQP_READ_THIS_PROP_STR("password"); connection_params.frame_max = (int) PHP_AMQP_READ_THIS_PROP_LONG("frameMax"); connection_params.channel_max = (int) PHP_AMQP_READ_THIS_PROP_LONG("channelMax"); connection_params.heartbeat = (int) PHP_AMQP_READ_THIS_PROP_LONG("heartbeat"); connection_params.read_timeout = PHP_AMQP_READ_THIS_PROP_DOUBLE("readTimeout"); connection_params.write_timeout = PHP_AMQP_READ_THIS_PROP_DOUBLE("writeTimeout"); connection_params.connect_timeout = PHP_AMQP_READ_THIS_PROP_DOUBLE("connectTimeout"); connection_params.rpc_timeout = PHP_AMQP_READ_THIS_PROP_DOUBLE("rpcTimeout"); connection_params.cacert = PHP_AMQP_READ_THIS_PROP_STRLEN("cacert") ? PHP_AMQP_READ_THIS_PROP_STR("cacert") : NULL; connection_params.cert = PHP_AMQP_READ_THIS_PROP_STRLEN("cert") ? PHP_AMQP_READ_THIS_PROP_STR("cert") : NULL; connection_params.key = PHP_AMQP_READ_THIS_PROP_STRLEN("key") ? PHP_AMQP_READ_THIS_PROP_STR("key") : NULL; connection_params.verify = (int) PHP_AMQP_READ_THIS_PROP_BOOL("verify"); connection_params.sasl_method = (int) PHP_AMQP_READ_THIS_PROP_LONG("saslMethod"); connection_params.connection_name = PHP_AMQP_READ_THIS_PROP_STRLEN("connectionName") ? PHP_AMQP_READ_THIS_PROP_STR("connectionName") : NULL; if (persistent) { zend_resource *le = NULL; /* Look for an established resource */ key_len = php_amqp_get_connection_hash(&connection_params, &key); if ((le = zend_hash_str_find_ptr(&EG(persistent_list), key, key_len)) != NULL) { efree(key); if (le->type != le_amqp_connection_resource_persistent) { /* hash conflict, given name associate with non-amqp persistent connection resource */ zend_throw_exception( amqp_connection_exception_class_entry, "Connection hash conflict detected. Persistent connection found that does not belong to AMQP.", 0 ); return 0; } /* An entry for this connection resource already exists */ /* Stash the connection resource in the connection */ connection->connection_resource = le->ptr; if (connection->connection_resource->resource != NULL) { /* resource in use! */ connection->connection_resource = NULL; zend_throw_exception( amqp_connection_exception_class_entry, "There are already established persistent connection to the same resource.", 0 ); return 0; } connection->connection_resource->resource = zend_register_resource( connection->connection_resource, persistent ? le_amqp_connection_resource_persistent : le_amqp_connection_resource ); connection->connection_resource->parent = connection; /* Set desired timeouts */ if (php_amqp_set_resource_read_timeout( connection->connection_resource, PHP_AMQP_READ_THIS_PROP_DOUBLE("readTimeout") ) == 0 || php_amqp_set_resource_write_timeout( connection->connection_resource, PHP_AMQP_READ_THIS_PROP_DOUBLE("writeTimeout") ) == 0 || php_amqp_set_resource_rpc_timeout( connection->connection_resource, PHP_AMQP_READ_THIS_PROP_DOUBLE("rpcTimeout") ) == 0) { php_amqp_disconnect_force(connection->connection_resource); return 0; } /* Set connection status to connected */ connection->connection_resource->is_connected = '\1'; connection->connection_resource->is_persistent = persistent; return 1; } efree(key); } connection->connection_resource = connection_resource_constructor(&connection_params, persistent); if (connection->connection_resource == NULL) { return 0; } connection->connection_resource->resource = zend_register_resource( connection->connection_resource, persistent ? le_amqp_connection_resource_persistent : le_amqp_connection_resource ); connection->connection_resource->parent = connection; /* Set connection status to connected */ connection->connection_resource->is_connected = '\1'; if (persistent) { connection->connection_resource->is_persistent = persistent; key_len = php_amqp_get_connection_hash(&connection_params, &key); zend_resource new_le; /* Store a reference in the persistence list */ new_le.ptr = connection->connection_resource; new_le.type = le_amqp_connection_resource_persistent; if (!zend_hash_str_update_mem(&EG(persistent_list), key, key_len, &new_le, sizeof(zend_resource))) { efree(key); php_amqp_disconnect_force(connection->connection_resource); zend_throw_exception( amqp_connection_exception_class_entry, "Could not store persistent connection in pool.", 0 ); return 0; } efree(key); } return 1; } void amqp_connection_free(zend_object *object) { amqp_connection_object *connection = PHP_AMQP_FETCH_CONNECTION(object); if (connection->connection_resource) { php_amqp_disconnect(connection->connection_resource); } zend_object_std_dtor(&connection->zo); } zend_object *amqp_connection_ctor(zend_class_entry *ce) { amqp_connection_object *connection = (amqp_connection_object *) ecalloc(1, sizeof(amqp_connection_object) + zend_object_properties_size(ce)); zend_object_std_init(&connection->zo, ce); AMQP_OBJECT_PROPERTIES_INIT(connection->zo, ce); connection->zo.handlers = &amqp_connection_object_handlers; return &connection->zo; } /* {{{ proto AMQPConnection::__construct([array optional]) * The array can contain 'host', 'port', 'login', 'password', 'vhost', 'read_timeout', 'write_timeout', 'connect_timeout', 'rpc_timeout' and 'timeout' (deprecated) indexes */ static PHP_METHOD(amqp_connection_class, __construct) { zval *ini_arr = NULL; zval *zdata = NULL; /* Parse out the method parameters */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "|a/", &ini_arr) == FAILURE) { RETURN_THROWS(); } /* Pull the login out of the $params array */ zdata = NULL; if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("login"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_string(zdata); } /* Validate the given login */ if (zdata && Z_STRLEN_P(zdata) > 0) { if (!php_amqp_is_valid_credential(Z_STR_P(zdata))) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'login' exceeds %d character limit.", PHP_AMQP_MAX_CREDENTIALS_LENGTH ); return; } zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("login"), zdata); } else { zend_update_property_string( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("login"), INI_STR("amqp.login") ); } /* Pull the password out of the $params array */ zdata = NULL; if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("password"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_string(zdata); } /* Validate the given password */ if (zdata && Z_STRLEN_P(zdata) > 0) { if (!php_amqp_is_valid_credential(Z_STR_P(zdata))) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'password' exceeds %d character limit.", PHP_AMQP_MAX_CREDENTIALS_LENGTH ); return; } zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("password"), Z_STRVAL_P(zdata), Z_STRLEN_P(zdata) ); } else { zend_update_property_string( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("password"), INI_STR("amqp.password") ); } /* Pull the host out of the $params array */ zdata = NULL; if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("host"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_string(zdata); } /* Validate the given host */ if (zdata && Z_STRLEN_P(zdata) > 0) { if (!php_amqp_is_valid_identifier(Z_STR_P(zdata))) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'host' exceeds %d character limit.", PHP_AMQP_MAX_IDENTIFIER_LENGTH ); return; } zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("host"), Z_STRVAL_P(zdata), Z_STRLEN_P(zdata) ); } else { zend_update_property_string(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("host"), INI_STR("amqp.host")); } /* Pull the vhost out of the $params array */ zdata = NULL; if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("vhost"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_string(zdata); } /* Validate the given vhost */ if (zdata && Z_STRLEN_P(zdata) > 0) { if (!php_amqp_is_valid_identifier(Z_STR_P(zdata))) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'vhost' exceeds %d character limit.", PHP_AMQP_MAX_IDENTIFIER_LENGTH ); return; } zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("vhost"), Z_STRVAL_P(zdata), Z_STRLEN_P(zdata) ); } else { zend_update_property_string( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("vhost"), INI_STR("amqp.vhost") ); } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("port"), INI_INT("amqp.port")); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("port"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_long(zdata); if (!php_amqp_is_valid_port(Z_LVAL_P(zdata))) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'port' must be a valid port number between %d and %d.", PHP_AMQP_MIN_PORT, PHP_AMQP_MAX_PORT ); return; } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("port"), Z_LVAL_P(zdata)); } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), INI_FLT("amqp.read_timeout") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("read_timeout"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_double(zdata); if (!php_amqp_is_valid_timeout(Z_DVAL_P(zdata))) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'read_timeout' must be greater than or equal to zero.", 0 ); return; } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), Z_DVAL_P(zdata) ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("timeout"))) != NULL) { /* 'read_timeout' takes precedence on 'timeout' but users have to know this */ php_error_docref(NULL, E_NOTICE, "Parameter 'timeout' is deprecated, 'read_timeout' used instead"); } } else if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("timeout"))) != NULL) { php_error_docref(NULL, E_DEPRECATED, "Parameter 'timeout' is deprecated; use 'read_timeout' instead"); SEPARATE_ZVAL(zdata); convert_to_double(zdata); if (!php_amqp_is_valid_timeout(Z_DVAL_P(zdata))) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'timeout' must be greater than or equal to zero.", 0 ); return; } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), Z_DVAL_P(zdata) ); } else { assert(DEFAULT_TIMEOUT != NULL); if (strcmp(DEFAULT_TIMEOUT, INI_STR("amqp.timeout")) != 0) { php_error_docref( NULL, E_DEPRECATED, "INI setting 'amqp.timeout' is deprecated; use 'amqp.read_timeout' instead" ); if (strcmp(DEFAULT_READ_TIMEOUT, INI_STR("amqp.read_timeout")) == 0) { zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), INI_FLT("amqp.timeout") ); } else { php_error_docref( NULL, E_NOTICE, "INI setting 'amqp.read_timeout' will be used instead of 'amqp.timeout'" ); zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), INI_FLT("amqp.read_timeout") ); } } else { zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), INI_FLT("amqp.read_timeout") ); } } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("writeTimeout"), INI_FLT("amqp.write_timeout") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("write_timeout"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_double(zdata); if (!php_amqp_is_valid_timeout(Z_DVAL_P(zdata))) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'write_timeout' must be greater than or equal to zero.", 0 ); return; } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("writeTimeout"), Z_DVAL_P(zdata) ); } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("rpcTimeout"), INI_FLT("amqp.rpc_timeout") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("rpc_timeout"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_double(zdata); if (!php_amqp_is_valid_timeout(Z_DVAL_P(zdata))) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'rpc_timeout' must be greater than or equal to zero.", 0 ); RETURN_THROWS(); } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("rpcTimeout"), Z_DVAL_P(zdata) ); } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connectTimeout"), INI_FLT("amqp.connect_timeout") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("connect_timeout"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_double(zdata); if (!php_amqp_is_valid_timeout(Z_DVAL_P(zdata))) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'connect_timeout' must be greater than or equal to zero.", 0 ); RETURN_THROWS(); } zend_update_property_double( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connectTimeout"), Z_DVAL_P(zdata) ); } zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("channelMax"), INI_INT("amqp.channel_max") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("channel_max"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_long(zdata); if (!php_amqp_is_valid_channel_max(Z_LVAL_P(zdata))) { zend_throw_exception(amqp_connection_exception_class_entry, "Parameter 'channel_max' is out of range.", 0); RETURN_THROWS(); } if (Z_LVAL_P(zdata) == 0) { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("channelMax"), PHP_AMQP_DEFAULT_CHANNEL_MAX ); } else { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("channelMax"), Z_LVAL_P(zdata) ); } } zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("frameMax"), INI_INT("amqp.frame_max") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("frame_max"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_long(zdata); if (!php_amqp_is_valid_frame_size_max(Z_LVAL_P(zdata))) { zend_throw_exception(amqp_connection_exception_class_entry, "Parameter 'frame_max' is out of range.", 0); RETURN_THROWS(); } if (Z_LVAL_P(zdata) == 0) { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("frameMax"), PHP_AMQP_DEFAULT_FRAME_MAX ); } else { zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("frameMax"), Z_LVAL_P(zdata) ); } } zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("heartbeat"), INI_INT("amqp.heartbeat") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("heartbeat"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_long(zdata); if (!php_amqp_is_valid_heartbeat(Z_LVAL_P(zdata))) { zend_throw_exception(amqp_connection_exception_class_entry, "Parameter 'heartbeat' is out of range.", 0); RETURN_THROWS(); } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("heartbeat"), Z_LVAL_P(zdata)); } zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("saslMethod"), INI_INT("amqp.sasl_method") ); if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("sasl_method"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_long(zdata); zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("saslMethod"), Z_LVAL_P(zdata)); } PHP_AMQP_EXTRACT_CONNECTION_STR("cacert"); PHP_AMQP_EXTRACT_CONNECTION_STR("key"); PHP_AMQP_EXTRACT_CONNECTION_STR("cert"); PHP_AMQP_EXTRACT_CONNECTION_BOOL("verify"); /* Pull the connection_name out of the $params array */ zdata = NULL; if (ini_arr && (zdata = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("connection_name"))) != NULL) { SEPARATE_ZVAL(zdata); convert_to_string(zdata); } if (zdata && Z_STRLEN_P(zdata) > 0) { zend_update_property_string( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connectionName"), Z_STRVAL_P(zdata) ); } } /* }}} */ /* {{{ proto amqp::isConnected() check amqp connection */ static PHP_METHOD(amqp_connection_class, isConnected) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); RETURN_BOOL(connection->connection_resource != NULL && connection->connection_resource->is_connected); } /* }}} */ /* {{{ proto amqp::connect() create amqp connection */ static PHP_METHOD(amqp_connection_class, connect) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource && connection->connection_resource->is_connected) { if (connection->connection_resource->is_persistent) { zend_throw_exception( amqp_connection_exception_class_entry, "Attempt to start transient connection while persistent one already established. Continue.", 0 ); } return; } /* Actually connect this resource to the broker */ php_amqp_connect(connection, 0, INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ /* {{{ proto amqp::connect() create amqp connection */ static PHP_METHOD(amqp_connection_class, pconnect) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource && connection->connection_resource->is_connected) { assert(connection->connection_resource != NULL); if (!connection->connection_resource->is_persistent) { zend_throw_exception( amqp_connection_exception_class_entry, "Attempt to start persistent connection while transient one already established. Continue.", 0 ); } return; } /* Actually connect this resource to the broker or use stored connection */ php_amqp_connect(connection, 1, INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ #define PERSISTENT_TRANSIENT_EXCEPTION_MESSAGE \ "Attempted to %s a %s connection while a %s connection is established. Call '%s' instead" /* {{{ proto amqp:pdisconnect() destroy amqp persistent connection */ static PHP_METHOD(amqp_connection_class, pdisconnect) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (!connection->connection_resource || !connection->connection_resource->is_connected) { return; } assert(connection->connection_resource != NULL); if (!connection->connection_resource->is_persistent) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, PERSISTENT_TRANSIENT_EXCEPTION_MESSAGE, "close", "persistent", "transient", "disconnect" ); return; } php_amqp_disconnect_force(connection->connection_resource); } /* }}} */ /* {{{ proto amqp::disconnect() destroy amqp connection */ static PHP_METHOD(amqp_connection_class, disconnect) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (!connection->connection_resource || !connection->connection_resource->is_connected) { return; } if (connection->connection_resource->is_persistent) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, PERSISTENT_TRANSIENT_EXCEPTION_MESSAGE, "close", "transient", "persistent", "pdisconnect" ); return; } assert(connection->connection_resource != NULL); php_amqp_disconnect(connection->connection_resource); } /* }}} */ /* {{{ proto amqp::reconnect() recreate amqp connection */ static PHP_METHOD(amqp_connection_class, reconnect) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource && connection->connection_resource->is_connected) { assert(connection->connection_resource != NULL); if (connection->connection_resource->is_persistent) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, PERSISTENT_TRANSIENT_EXCEPTION_MESSAGE, "reconnect", "transient", "persistent", "preconnect" ); return; } php_amqp_disconnect(connection->connection_resource); } php_amqp_connect(connection, 0, INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ /* {{{ proto amqp::preconnect() recreate amqp connection */ static PHP_METHOD(amqp_connection_class, preconnect) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource && connection->connection_resource->is_connected) { assert(connection->connection_resource != NULL); if (!connection->connection_resource->is_persistent) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, PERSISTENT_TRANSIENT_EXCEPTION_MESSAGE, "reconnect", "persistent", "transient", "reconnect" ); return; } php_amqp_disconnect_force(connection->connection_resource); } php_amqp_connect(connection, 1, INTERNAL_FUNCTION_PARAM_PASSTHRU); } /* }}} */ /* {{{ proto amqp::getLogin() get the login */ static PHP_METHOD(amqp_connection_class, getLogin) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("login"); } /* }}} */ /* {{{ proto amqp::setLogin(string login) set the login */ static PHP_METHOD(amqp_connection_class, setLogin) { char *login = NULL; size_t login_len = 0; /* Get the login from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &login, &login_len) == FAILURE) { RETURN_THROWS(); } /* Validate login length */ if (login_len > PHP_AMQP_MAX_CREDENTIALS_LENGTH) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'login' exceeds %d character limit.", PHP_AMQP_MAX_CREDENTIALS_LENGTH ); return; } zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("login"), login, login_len); } /* }}} */ /* {{{ proto amqp::getPassword() get the password */ static PHP_METHOD(amqp_connection_class, getPassword) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("password"); } /* }}} */ /* {{{ proto amqp::setPassword(string password) set the password */ static PHP_METHOD(amqp_connection_class, setPassword) { char *password = NULL; size_t password_len = 0; /* Get the password from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &password, &password_len) == FAILURE) { RETURN_THROWS(); } /* Validate password length */ if (password_len > PHP_AMQP_MAX_CREDENTIALS_LENGTH) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'password' exceeds %d character limit.", PHP_AMQP_MAX_CREDENTIALS_LENGTH ); return; } zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("password"), password, password_len ); } /* }}} */ /* {{{ proto amqp::getHost() get the host */ static PHP_METHOD(amqp_connection_class, getHost) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("host"); } /* }}} */ /* {{{ proto amqp::setHost(string host) set the host */ static PHP_METHOD(amqp_connection_class, setHost) { char *host = NULL; size_t host_len = 0; /* Get the host from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &host, &host_len) == FAILURE) { RETURN_THROWS(); } /* Validate host length */ if (host_len > PHP_AMQP_MAX_IDENTIFIER_LENGTH) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'host' exceeds %d character limit.", PHP_AMQP_MAX_IDENTIFIER_LENGTH ); return; } zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("host"), host, host_len); } /* }}} */ /* {{{ proto amqp::getPort() get the port */ static PHP_METHOD(amqp_connection_class, getPort) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("port"); } /* }}} */ /* {{{ proto amqp::setPort(mixed port) set the port */ static PHP_METHOD(amqp_connection_class, setPort) { zend_long port; /* Get the port from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &port) == FAILURE) { RETURN_THROWS(); } /* Check the port value */ if (!php_amqp_is_valid_port(port)) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'port' must be a valid port number between %d and %d.", PHP_AMQP_MIN_PORT, PHP_AMQP_MAX_PORT ); return; } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("port"), port); } /* }}} */ /* {{{ proto amqp::getVhost() get the vhost */ static PHP_METHOD(amqp_connection_class, getVhost) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("vhost"); } /* }}} */ /* {{{ proto amqp::setVhost(string vhost) set the vhost */ static PHP_METHOD(amqp_connection_class, setVhost) { char *vhost = NULL; size_t vhost_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &vhost, &vhost_len) == FAILURE) { RETURN_THROWS(); } /* Validate vhost length */ if (vhost_len > PHP_AMQP_MAX_IDENTIFIER_LENGTH) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Parameter 'vhost' exceeds %d characters limit.", PHP_AMQP_MAX_IDENTIFIER_LENGTH ); return; } zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("vhost"), vhost, vhost_len); } /* }}} */ /* {{{ proto amqp::getTimeout() @deprecated get the timeout */ static PHP_METHOD(amqp_connection_class, getTimeout) { php_error_docref( NULL, E_DEPRECATED, "AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead" ); zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("readTimeout"); } /* }}} */ /* {{{ proto amqp::setTimeout(double timeout) @deprecated set the timeout */ static PHP_METHOD(amqp_connection_class, setTimeout) { amqp_connection_object *connection; double read_timeout; php_error_docref( NULL, E_DEPRECATED, "AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) " "instead" ); /* Get the timeout from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &read_timeout) == FAILURE) { RETURN_THROWS(); } /* Validate timeout */ if (!php_amqp_is_valid_timeout(read_timeout)) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'timeout' must be greater than or equal to zero.", 0 ); return; } /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); zend_update_property_double(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), read_timeout); if (connection->connection_resource && connection->connection_resource->is_connected) { if (php_amqp_set_resource_read_timeout(connection->connection_resource, read_timeout) == 0) { php_amqp_disconnect_force(connection->connection_resource); zend_throw_exception(amqp_connection_exception_class_entry, "Could not set read timeout", 0); } } } /* }}} */ /* {{{ proto amqp::getReadTimeout() get the read timeout */ static PHP_METHOD(amqp_connection_class, getReadTimeout) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("readTimeout"); } /* }}} */ /* {{{ proto amqp::setReadTimeout(double timeout) set read timeout */ static PHP_METHOD(amqp_connection_class, setReadTimeout) { amqp_connection_object *connection; double read_timeout; /* Get the timeout from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &read_timeout) == FAILURE) { RETURN_THROWS(); } /* Validate timeout */ if (!php_amqp_is_valid_timeout(read_timeout)) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'readTimeout' must be greater than or equal to zero.", 0 ); return; } /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); zend_update_property_double(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("readTimeout"), read_timeout); if (connection->connection_resource && connection->connection_resource->is_connected) { if (php_amqp_set_resource_read_timeout(connection->connection_resource, read_timeout) == 0) { php_amqp_disconnect_force(connection->connection_resource); zend_throw_exception(amqp_connection_exception_class_entry, "Could not set read timeout", 0); } } } /* }}} */ /* {{{ proto amqp::getWriteTimeout() get write timeout */ static PHP_METHOD(amqp_connection_class, getWriteTimeout) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("writeTimeout"); } /* }}} */ /* {{{ proto amqp::setWriteTimeout(double timeout) set write timeout */ static PHP_METHOD(amqp_connection_class, setWriteTimeout) { amqp_connection_object *connection; double write_timeout; /* Get the timeout from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &write_timeout) == FAILURE) { RETURN_THROWS(); } /* Validate timeout */ if (!php_amqp_is_valid_timeout(write_timeout)) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'writeTimeout' must be greater than or equal to zero.", 0 ); return; } /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); zend_update_property_double(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("writeTimeout"), write_timeout); if (connection->connection_resource && connection->connection_resource->is_connected) { if (php_amqp_set_resource_write_timeout(connection->connection_resource, write_timeout) == 0) { php_amqp_disconnect_force(connection->connection_resource); zend_throw_exception(amqp_connection_exception_class_entry, "Could not set write timeout", 0); } } } /* }}} */ /* {{{ proto amqp::getRpcTimeout() get rpc timeout */ static PHP_METHOD(amqp_connection_class, getConnectTimeout) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("connectTimeout"); } /* }}} */ /* {{{ proto amqp::getRpcTimeout() get rpc timeout */ static PHP_METHOD(amqp_connection_class, getRpcTimeout) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("rpcTimeout"); } /* }}} */ /* {{{ proto amqp::setRpcTimeout(double timeout) set rpc timeout */ static PHP_METHOD(amqp_connection_class, setRpcTimeout) { amqp_connection_object *connection; double rpc_timeout; /* Get the timeout from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", &rpc_timeout) == FAILURE) { RETURN_THROWS(); } /* Validate timeout */ if (!php_amqp_is_valid_timeout(rpc_timeout)) { zend_throw_exception( amqp_connection_exception_class_entry, "Parameter 'rpcTimeout' must be greater than or equal to zero.", 0 ); return; } /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); zend_update_property_double(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("rpcTimeout"), rpc_timeout); if (connection->connection_resource && connection->connection_resource->is_connected) { if (php_amqp_set_resource_rpc_timeout(connection->connection_resource, rpc_timeout) == 0) { php_amqp_disconnect_force(connection->connection_resource); zend_throw_exception(amqp_connection_exception_class_entry, "Could not set connect timeout", 0); } } } /* }}} */ /* {{{ proto amqp::getUsedChannels() Get max used channels number */ static PHP_METHOD(amqp_connection_class, getUsedChannels) { amqp_connection_object *connection; /* Get the timeout from the method params */ PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (!connection->connection_resource || !connection->connection_resource->is_connected) { php_error_docref(NULL, E_WARNING, "Connection is not connected."); RETURN_LONG(0); } RETURN_LONG(connection->connection_resource->used_slots); } /* }}} */ /* {{{ proto amqp::getMaxChannels() Get max supported channels number per connection */ PHP_METHOD(amqp_connection_class, getMaxChannels) { zval rv; amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource && connection->connection_resource->is_connected) { RETURN_LONG(connection->connection_resource->max_slots); } PHP_AMQP_RETURN_THIS_PROP("channelMax"); } /* }}} */ /* {{{ proto amqp::getMaxFrameSize() Get max supported frame size per connection in bytes */ static PHP_METHOD(amqp_connection_class, getMaxFrameSize) { zval rv; amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource && connection->connection_resource->is_connected) { RETURN_LONG(amqp_get_frame_max(connection->connection_resource->connection_state)); } PHP_AMQP_RETURN_THIS_PROP("frameMax"); } /* }}} */ /* {{{ proto amqp::getHeartbeatInterval() Get number of seconds between heartbeats of the connection in seconds */ static PHP_METHOD(amqp_connection_class, getHeartbeatInterval) { zval rv; amqp_connection_object *connection; PHP_AMQP_NOPARAMS() /* Get the connection object out of the store */ connection = PHP_AMQP_GET_CONNECTION(getThis()); if (connection->connection_resource != NULL && connection->connection_resource->is_connected != '\0') { RETURN_LONG(amqp_get_heartbeat(connection->connection_resource->connection_state)); } PHP_AMQP_RETURN_THIS_PROP("heartbeat"); } /* }}} */ /* {{{ proto amqp::isPersistent() check whether amqp connection is persistent */ static PHP_METHOD(amqp_connection_class, isPersistent) { amqp_connection_object *connection; PHP_AMQP_NOPARAMS() connection = PHP_AMQP_GET_CONNECTION(getThis()); RETURN_BOOL(connection->connection_resource && connection->connection_resource->is_persistent); } /* }}} */ /* {{{ proto amqp::getCACert() */ static PHP_METHOD(amqp_connection_class, getCACert) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("cacert"); } /* }}} */ /* {{{ proto amqp::setCACert(string cacert) */ static PHP_METHOD(amqp_connection_class, setCACert) { char *str = NULL; size_t str_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &str, &str_len) == FAILURE) { RETURN_THROWS(); } if (str == NULL) { zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("cacert")); } else { zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("cacert"), str, str_len); } } /* }}} */ /* {{{ proto amqp::getCert() */ static PHP_METHOD(amqp_connection_class, getCert) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("cert"); } /* }}} */ /* {{{ proto amqp::setCert(string cert) */ static PHP_METHOD(amqp_connection_class, setCert) { char *str = NULL; size_t str_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &str, &str_len) == FAILURE) { RETURN_THROWS(); } if (str == NULL) { zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("cert")); } else { zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("cert"), str, str_len); } } /* }}} */ /* {{{ proto amqp::getKey() */ static PHP_METHOD(amqp_connection_class, getKey) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("key"); } /* }}} */ /* {{{ proto amqp::setKey(string key) */ static PHP_METHOD(amqp_connection_class, setKey) { char *str = NULL; size_t str_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &str, &str_len) == FAILURE) { RETURN_THROWS(); } if (str == NULL) { zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("key")); } else { zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("key"), str, str_len); } } /* }}} */ /* {{{ proto amqp::getVerify() */ static PHP_METHOD(amqp_connection_class, getVerify) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("verify"); } /* }}} */ /* {{{ proto amqp::setVerify(bool verify) */ static PHP_METHOD(amqp_connection_class, setVerify) { bool verify = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "b", &verify) == FAILURE) { RETURN_THROWS(); } zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("verify"), verify); } /* }}} */ /* {{{ proto amqp::getSaslMethod() get sasl method */ static PHP_METHOD(amqp_connection_class, getSaslMethod) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("saslMethod"); } /* }}} */ /* {{{ proto amqp::setSaslMethod(mixed method) set sasl method */ static PHP_METHOD(amqp_connection_class, setSaslMethod) { long method; /* Get the port from the method params */ if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &method) == FAILURE) { RETURN_THROWS(); } /* Check the method value */ if (method != AMQP_SASL_METHOD_PLAIN && method != AMQP_SASL_METHOD_EXTERNAL) { zend_throw_exception( amqp_connection_exception_class_entry, "Invalid SASL method given. Method must be AMQP_SASL_METHOD_PLAIN or AMQP_SASL_METHOD_EXTERNAL.", 0 ); return; } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("saslMethod"), method); } /* }}} */ /* {{{ proto amqp::getConnectionName() */ static PHP_METHOD(amqp_connection_class, getConnectionName) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("connectionName"); } /* }}} */ /* {{{ proto amqp::setConnectionName(string connectionName) */ static PHP_METHOD(amqp_connection_class, setConnectionName) { char *str = NULL; size_t str_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &str, &str_len) == FAILURE) { RETURN_THROWS(); } if (str == NULL) { zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connectionName")); } else { zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connectionName"), str, str_len ); } } /* }}} */ /* amqp_connection_class ARG_INFO definition */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_connection_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, credentials, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_isConnected, ZEND_SEND_BY_VAL, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_connect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_pconnect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_pdisconnect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_disconnect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_reconnect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_preconnect, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getLogin, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setLogin, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, login, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getPassword, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setPassword, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, password, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getHost, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setHost, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, host, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getPort, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setPort, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, port, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getVhost, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setVhost, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, vhost, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getTimeout, ZEND_SEND_BY_VAL, 0, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setTimeout, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getReadTimeout, ZEND_SEND_BY_VAL, 0, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setReadTimeout, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_connection_class_getWriteTimeout, ZEND_SEND_BY_VAL, 0, IS_DOUBLE, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setWriteTimeout, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_connection_class_getConnectTimeout, ZEND_SEND_BY_VAL, 0, IS_DOUBLE, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getRpcTimeout, ZEND_SEND_BY_VAL, 0, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setRpcTimeout, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, timeout, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getUsedChannels, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getMaxChannels, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getMaxFrameSize, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_connection_class_getHeartbeatInterval, ZEND_SEND_BY_VAL, 0, IS_LONG, 0 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_isPersistent, ZEND_SEND_BY_VAL, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getCACert, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setCACert, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, cacert, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getCert, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setCert, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, cert, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getKey, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setKey, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getVerify, ZEND_SEND_BY_VAL, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setVerify, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, verify, _IS_BOOL, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_getSaslMethod, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_connection_class_setSaslMethod, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, saslMethod, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_connection_class_getConnectionName, ZEND_SEND_BY_VAL, 0, IS_STRING, 1 ) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX( arginfo_amqp_connection_class_setConnectionName, ZEND_SEND_BY_VAL, 1, IS_VOID, 0 ) ZEND_ARG_TYPE_INFO(0, connectionName, IS_STRING, 1) ZEND_END_ARG_INFO() zend_function_entry amqp_connection_class_functions[] = { PHP_ME(amqp_connection_class, __construct, arginfo_amqp_connection_class__construct, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, isConnected, arginfo_amqp_connection_class_isConnected, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, connect, arginfo_amqp_connection_class_connect, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, pconnect, arginfo_amqp_connection_class_pconnect, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, pdisconnect, arginfo_amqp_connection_class_pdisconnect, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, disconnect, arginfo_amqp_connection_class_disconnect, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, reconnect, arginfo_amqp_connection_class_reconnect, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, preconnect, arginfo_amqp_connection_class_preconnect, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getLogin, arginfo_amqp_connection_class_getLogin, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setLogin, arginfo_amqp_connection_class_setLogin, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getPassword, arginfo_amqp_connection_class_getPassword, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setPassword, arginfo_amqp_connection_class_setPassword, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getHost, arginfo_amqp_connection_class_getHost, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setHost, arginfo_amqp_connection_class_setHost, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getPort, arginfo_amqp_connection_class_getPort, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setPort, arginfo_amqp_connection_class_setPort, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getVhost, arginfo_amqp_connection_class_getVhost, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setVhost, arginfo_amqp_connection_class_setVhost, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getTimeout, arginfo_amqp_connection_class_getTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setTimeout, arginfo_amqp_connection_class_setTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getReadTimeout, arginfo_amqp_connection_class_getReadTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setReadTimeout, arginfo_amqp_connection_class_setReadTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getWriteTimeout, arginfo_amqp_connection_class_getWriteTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setWriteTimeout, arginfo_amqp_connection_class_setWriteTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getConnectTimeout, arginfo_amqp_connection_class_getConnectTimeout, ZEND_ACC_PUBLIC) /** setConnectTimeout intentionally left out */ PHP_ME(amqp_connection_class, getRpcTimeout, arginfo_amqp_connection_class_getRpcTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setRpcTimeout, arginfo_amqp_connection_class_setRpcTimeout, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getUsedChannels, arginfo_amqp_connection_class_getUsedChannels, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getMaxChannels, arginfo_amqp_connection_class_getMaxChannels, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, isPersistent, arginfo_amqp_connection_class_isPersistent, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getHeartbeatInterval, arginfo_amqp_connection_class_getHeartbeatInterval, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getMaxFrameSize, arginfo_amqp_connection_class_getMaxFrameSize, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getCACert, arginfo_amqp_connection_class_getCACert, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setCACert, arginfo_amqp_connection_class_setCACert, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getCert, arginfo_amqp_connection_class_getCert, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setCert, arginfo_amqp_connection_class_setCert, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getKey, arginfo_amqp_connection_class_getKey, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setKey, arginfo_amqp_connection_class_setKey, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getVerify, arginfo_amqp_connection_class_getVerify, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setVerify, arginfo_amqp_connection_class_setVerify, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getSaslMethod, arginfo_amqp_connection_class_getSaslMethod, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setSaslMethod, arginfo_amqp_connection_class_setSaslMethod, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, getConnectionName, arginfo_amqp_connection_class_getConnectionName, ZEND_ACC_PUBLIC) PHP_ME(amqp_connection_class, setConnectionName, arginfo_amqp_connection_class_setConnectionName, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_connection) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPConnection", amqp_connection_class_functions); ce.create_object = amqp_connection_ctor; this_ce = zend_register_internal_class(&ce); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "login", ZEND_ACC_PRIVATE, IS_STRING, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "password", ZEND_ACC_PRIVATE, IS_STRING, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "host", ZEND_ACC_PRIVATE, IS_STRING, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "vhost", ZEND_ACC_PRIVATE, IS_STRING, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "port", ZEND_ACC_PRIVATE, IS_LONG, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "readTimeout", ZEND_ACC_PRIVATE, IS_DOUBLE, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "writeTimeout", ZEND_ACC_PRIVATE, IS_DOUBLE, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "connectTimeout", ZEND_ACC_PRIVATE, IS_DOUBLE, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "rpcTimeout", ZEND_ACC_PRIVATE, IS_DOUBLE, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "frameMax", ZEND_ACC_PRIVATE, IS_LONG, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "channelMax", ZEND_ACC_PRIVATE, IS_LONG, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "heartbeat", ZEND_ACC_PRIVATE, IS_LONG, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "cacert", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "key", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "cert", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "verify", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_TRUE); zval default_sasl_method; ZVAL_LONG(&default_sasl_method, DEFAULT_SASL_METHOD); PHP_AMQP_DECLARE_TYPED_PROPERTY_ZVAL( this_ce, "saslMethod", ZEND_ACC_PRIVATE, PHP_AMQP_DECLARE_PROPERTY_TYPE(IS_LONG, 0), default_sasl_method ); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "connectionName", ZEND_ACC_PRIVATE, IS_STRING, 1); memcpy(&amqp_connection_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); amqp_connection_object_handlers.offset = XtOffsetOf(amqp_connection_object, zo); amqp_connection_object_handlers.free_obj = amqp_connection_free; return SUCCESS; } amqp-2.1.2/amqp_connection.h0000644000076500000240000000340414553444052015556 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_connection_class_entry; int php_amqp_connect(amqp_connection_object *amqp_connection, bool persistent, INTERNAL_FUNCTION_PARAMETERS); void php_amqp_disconnect_force(amqp_connection_resource *resource); PHP_MINIT_FUNCTION(amqp_connection); amqp-2.1.2/amqp_connection_resource.c0000644000076500000240000006127414553444052017471 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "ext/standard/datetime.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #include #include #else #include #include #include #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif #include "amqp_methods_handling.h" #include "amqp_connection_resource.h" #include "amqp_channel.h" #include "php_amqp.h" #ifndef E_DEPRECATED #define E_DEPRECATED E_WARNING #endif int le_amqp_connection_resource; int le_amqp_connection_resource_persistent; static void connection_resource_destructor(amqp_connection_resource *resource, int persistent); static void php_amqp_close_connection_from_server( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *resource ); static void php_amqp_close_channel_from_server( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *resource, amqp_channel_t channel_id ); /* Figure out what's going on connection and handle protocol exceptions, if any */ int php_amqp_connection_resource_error( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *resource, amqp_channel_t channel_id ) { assert(resource != NULL); switch (reply.reply_type) { case AMQP_RESPONSE_NORMAL: return PHP_AMQP_RESOURCE_RESPONSE_OK; case AMQP_RESPONSE_NONE: spprintf(message, 0, "Missing RPC reply type."); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; case AMQP_RESPONSE_LIBRARY_EXCEPTION: spprintf(message, 0, "%s", amqp_error_string2(reply.library_error)); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; case AMQP_RESPONSE_SERVER_EXCEPTION: switch (reply.reply.id) { case AMQP_CONNECTION_CLOSE_METHOD: { php_amqp_close_connection_from_server(reply, message, resource); return PHP_AMQP_RESOURCE_RESPONSE_ERROR_CONNECTION_CLOSED; } case AMQP_CHANNEL_CLOSE_METHOD: { php_amqp_close_channel_from_server(reply, message, resource, channel_id); return PHP_AMQP_RESOURCE_RESPONSE_ERROR_CHANNEL_CLOSED; } } /* Default for the above switch should be handled by the below default. */ default: spprintf(message, 0, "Unknown server error, method id 0x%08X", reply.reply.id); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; } /* Should not never get here*/ } static void php_amqp_close_connection_from_server( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *resource ) { amqp_connection_close_t *m = (amqp_connection_close_t *) reply.reply.decoded; int result; if (!reply.reply.id) { PHP_AMQP_G(error_code) = -1; spprintf( message, 0, "Server connection error: %ld, message: %s", (long) PHP_AMQP_G(error_code), "unexpected response" ); } else { PHP_AMQP_G(error_code) = m->reply_code; spprintf( message, 0, "Server connection error: %d, message: %.*s", m->reply_code, (int) m->reply_text.len, (char *) m->reply_text.bytes ); } /* * - If r.reply.id == AMQP_CONNECTION_CLOSE_METHOD a connection exception * occurred, cast r.reply.decoded to amqp_connection_close_t* to see * details of the exception. The client amqp_send_method() a * amqp_connection_close_ok_t and disconnect from the broker. */ amqp_connection_close_ok_t *decoded = (amqp_connection_close_ok_t *) NULL; result = amqp_send_method( resource->connection_state, 0, /* NOTE: 0-channel is reserved for things like this */ AMQP_CONNECTION_CLOSE_OK_METHOD, &decoded ); if (result != AMQP_STATUS_OK) { zend_throw_exception(amqp_channel_exception_class_entry, "An error occurred while closing the connection.", 0); } /* Prevent finishing AMQP connection in connection resource destructor */ resource->is_connected = '\0'; } static void php_amqp_close_channel_from_server( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *resource, amqp_channel_t channel_id ) { assert(channel_id > 0 && channel_id <= resource->max_slots); amqp_channel_close_t *m = (amqp_channel_close_t *) reply.reply.decoded; if (!reply.reply.id) { PHP_AMQP_G(error_code) = -1; spprintf( message, 0, "Server channel error: %ld, message: %s", (long) PHP_AMQP_G(error_code), "unexpected response" ); } else { PHP_AMQP_G(error_code) = m->reply_code; spprintf( message, 0, "Server channel error: %d, message: %.*s", m->reply_code, (int) m->reply_text.len, (char *) m->reply_text.bytes ); } /* * - If r.reply.id == AMQP_CHANNEL_CLOSE_METHOD a channel exception * occurred, cast r.reply.decoded to amqp_channel_close_t* to see details * of the exception. The client should amqp_send_method() a * amqp_channel_close_ok_t. The channel must be re-opened before it * can be used again. Any resources associated with the channel * (auto-delete exchanges, auto-delete queues, consumers) are invalid * and must be recreated before attempting to use them again. */ if (resource) { int result; amqp_channel_close_ok_t *decoded = (amqp_channel_close_ok_t *) NULL; result = amqp_send_method(resource->connection_state, channel_id, AMQP_CHANNEL_CLOSE_OK_METHOD, &decoded); if (result != AMQP_STATUS_OK) { zend_throw_exception(amqp_channel_exception_class_entry, "An error occurred while closing channel.", 0); } } } int php_amqp_connection_resource_error_advanced(amqp_rpc_reply_t reply, char **message, amqp_channel_object *channel) { amqp_frame_t frame; assert(AMQP_RESPONSE_LIBRARY_EXCEPTION == reply.reply_type); assert(AMQP_STATUS_UNEXPECTED_STATE == reply.library_error); if (channel->channel_resource->channel_id < 0 || AMQP_STATUS_OK != amqp_simple_wait_frame(channel->channel_resource->connection_resource->connection_state, &frame)) { if (*message != NULL) { efree(*message); } spprintf(message, 0, "%s", amqp_error_string2(reply.library_error)); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; } if (channel->channel_resource->channel_id != frame.channel) { spprintf(message, 0, "Channel mismatch"); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; } if (AMQP_FRAME_METHOD == frame.frame_type) { switch (frame.payload.method.id) { case AMQP_CONNECTION_CLOSE_METHOD: { php_amqp_close_connection_from_server(reply, message, channel->channel_resource->connection_resource); return PHP_AMQP_RESOURCE_RESPONSE_ERROR_CONNECTION_CLOSED; } case AMQP_CHANNEL_CLOSE_METHOD: { php_amqp_close_channel_from_server( reply, message, channel->channel_resource->connection_resource, channel->channel_resource->channel_id ); return PHP_AMQP_RESOURCE_RESPONSE_ERROR_CHANNEL_CLOSED; } case AMQP_BASIC_ACK_METHOD: /* if we've turned publisher confirms on, and we've published a message * here is a message being confirmed */ return php_amqp_handle_basic_ack(message, channel, &frame.payload.method); case AMQP_BASIC_NACK_METHOD: /* if we've turned publisher confirms on, and we've published a message * here is a message being confirmed */ return php_amqp_handle_basic_nack(message, channel, &frame.payload.method); case AMQP_BASIC_RETURN_METHOD: /* if a published message couldn't be routed and the mandatory flag was set * this is what would be returned. The message then needs to be read. */ return php_amqp_handle_basic_return(message, channel, &frame.payload.method); default: if (*message != NULL) { efree(*message); } spprintf(message, 0, "An unexpected method was received 0x%08X\n", frame.payload.method.id); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; } } if (*message != NULL) { efree(*message); } spprintf(message, 0, "%s", amqp_error_string2(reply.library_error)); return PHP_AMQP_RESOURCE_RESPONSE_ERROR; } /* Socket-related functions */ int php_amqp_set_resource_read_timeout(amqp_connection_resource *resource, double timeout) { assert(timeout >= 0.0); #ifdef PHP_WIN32 DWORD read_timeout; /* In Windows, setsockopt with SO_RCVTIMEO sets actual timeout to a value that's 500ms greater than specified value. Also, it's not possible to set timeout to any value below 500ms. Zero timeout works like it should, however. */ if (timeout == 0.) { read_timeout = 0; } else { read_timeout = (int) (max(timeout * 1.e+3 - .5e+3, 1.)); } #else struct timeval read_timeout; read_timeout.tv_sec = (int) floor(timeout); read_timeout.tv_usec = (int) ((timeout - floor(timeout)) * 1.e+6); #endif if (0 != setsockopt( amqp_get_sockfd(resource->connection_state), SOL_SOCKET, SO_RCVTIMEO, (char *) &read_timeout, sizeof(read_timeout) )) { zend_throw_exception(amqp_connection_exception_class_entry, "Socket error: cannot setsockopt SO_RCVTIMEO", 0); return 0; } return 1; } int php_amqp_set_resource_rpc_timeout(amqp_connection_resource *resource, double timeout) { assert(timeout >= 0.0); #if AMQP_VERSION_MAJOR * 100 + AMQP_VERSION_MINOR * 10 + AMQP_VERSION_PATCH >= 90 struct timeval rpc_timeout; if (timeout == 0.) return 1; rpc_timeout.tv_sec = (int) floor(timeout); rpc_timeout.tv_usec = (int) ((timeout - floor(timeout)) * 1.e+6); if (AMQP_STATUS_OK != amqp_set_rpc_timeout(resource->connection_state, &rpc_timeout)) { zend_throw_exception(amqp_connection_exception_class_entry, "Cannot set rpc_timeout", 0); return 0; } #endif return 1; } int php_amqp_set_resource_write_timeout(amqp_connection_resource *resource, double timeout) { assert(timeout >= 0.0); #ifdef PHP_WIN32 DWORD write_timeout; if (timeout == 0.) { write_timeout = 0; } else { write_timeout = (int) (max(timeout * 1.e+3 - .5e+3, 1.)); } #else struct timeval write_timeout; write_timeout.tv_sec = (int) floor(timeout); write_timeout.tv_usec = (int) ((timeout - floor(timeout)) * 1.e+6); #endif if (0 != setsockopt( amqp_get_sockfd(resource->connection_state), SOL_SOCKET, SO_SNDTIMEO, (char *) &write_timeout, sizeof(write_timeout) )) { zend_throw_exception(amqp_connection_exception_class_entry, "Socket error: cannot setsockopt SO_SNDTIMEO", 0); return 0; } return 1; } /* Channel-related functions */ amqp_channel_t php_amqp_connection_resource_get_available_channel_id(amqp_connection_resource *resource) { assert(resource != NULL); assert(resource->slots != NULL); /* Check if there are any open slots */ if (resource->used_slots >= resource->max_slots) { return 0; } amqp_channel_t slot; for (slot = resource->used_slots; slot < resource->max_slots; slot++) { if (resource->slots[slot] == 0) { return (amqp_channel_t) (slot + 1); } } return 0; } int php_amqp_connection_resource_register_channel( amqp_connection_resource *resource, amqp_channel_resource *channel_resource, amqp_channel_t channel_id ) { assert(resource != NULL); assert(resource->slots != NULL); assert(channel_id > 0 && channel_id <= resource->max_slots); if (resource->slots[channel_id - 1] != 0) { return FAILURE; } resource->slots[channel_id - 1] = channel_resource; channel_resource->connection_resource = resource; resource->used_slots++; return SUCCESS; } int php_amqp_connection_resource_unregister_channel(amqp_connection_resource *resource, amqp_channel_t channel_id) { assert(resource != NULL); assert(resource->slots != NULL); assert(channel_id > 0 && channel_id <= resource->max_slots); if (resource->slots[channel_id - 1] != 0) { resource->slots[channel_id - 1]->connection_resource = NULL; resource->slots[channel_id - 1] = 0; resource->used_slots--; } return SUCCESS; } /* Creating and destroying resource */ amqp_connection_resource *connection_resource_constructor(amqp_connection_params *params, bool persistent) { struct timeval tv = {0}; struct timeval *tv_ptr = &tv; char *std_datetime; amqp_table_entry_t client_properties_entries[4]; amqp_table_t client_properties_table; amqp_table_entry_t custom_properties_entries[2]; amqp_table_t custom_properties_table; amqp_connection_resource *resource; /* Allocate space for the connection resource */ resource = (amqp_connection_resource *) pecalloc(1, sizeof(amqp_connection_resource), persistent); /* Create the connection */ resource->connection_state = amqp_new_connection(); /* Create socket object */ if (params->cacert) { resource->socket = amqp_ssl_socket_new(resource->connection_state); if (!resource->socket) { zend_throw_exception( amqp_connection_exception_class_entry, "Socket error: could not create SSL socket.", 0 ); return NULL; } if (amqp_ssl_socket_set_cacert(resource->socket, params->cacert) != AMQP_STATUS_OK) { zend_throw_exception( amqp_connection_exception_class_entry, "Socket error: could not set CA certificate.", 0 ); connection_resource_destructor(resource, persistent); return NULL; } #if AMQP_VERSION_MAJOR * 100 + AMQP_VERSION_MINOR * 10 + AMQP_VERSION_PATCH >= 80 amqp_ssl_socket_set_verify_peer(resource->socket, params->verify); amqp_ssl_socket_set_verify_hostname(resource->socket, params->verify); #else amqp_ssl_socket_set_verify(resource->socket, params->verify); #endif if (params->cert && params->key) { int client_cert_result = amqp_ssl_socket_set_key(resource->socket, params->cert, params->key); if (client_cert_result != AMQP_STATUS_OK) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Socket error: could not set client cert, %s", amqp_error_string2(client_cert_result) ); connection_resource_destructor(resource, persistent); return NULL; } } } else { resource->socket = amqp_tcp_socket_new(resource->connection_state); if (!resource->socket) { zend_throw_exception(amqp_connection_exception_class_entry, "Socket error: could not create socket.", 0); return NULL; } } if (params->connect_timeout > 0) { tv.tv_sec = (long int) params->connect_timeout; tv.tv_usec = (long int) ((params->connect_timeout - tv.tv_sec) * 1000000); } else { tv_ptr = NULL; } /* Try to connect and verify that no error occurred */ int connection_result = amqp_socket_open_noblock(resource->socket, params->host, params->port, tv_ptr); if (connection_result != AMQP_STATUS_OK) { zend_throw_exception_ex( amqp_connection_exception_class_entry, 0, "Socket error: could not connect to host, %s", amqp_error_string2(connection_result) ); connection_resource_destructor(resource, persistent); return NULL; } if (!php_amqp_set_resource_read_timeout(resource, params->read_timeout)) { connection_resource_destructor(resource, persistent); return NULL; } if (!php_amqp_set_resource_write_timeout(resource, params->write_timeout)) { connection_resource_destructor(resource, persistent); return NULL; } if (!php_amqp_set_resource_rpc_timeout(resource, params->rpc_timeout)) { connection_resource_destructor(resource, persistent); return NULL; } std_datetime = php_std_date(time(NULL)); client_properties_entries[0].key = amqp_cstring_bytes("type"); client_properties_entries[0].value.kind = AMQP_FIELD_KIND_UTF8; client_properties_entries[0].value.value.bytes = amqp_cstring_bytes("php-amqp extension"); client_properties_entries[1].key = amqp_cstring_bytes("version"); client_properties_entries[1].value.kind = AMQP_FIELD_KIND_UTF8; client_properties_entries[1].value.value.bytes = amqp_cstring_bytes(PHP_AMQP_VERSION); client_properties_entries[2].key = amqp_cstring_bytes("connection type"); client_properties_entries[2].value.kind = AMQP_FIELD_KIND_UTF8; client_properties_entries[2].value.value.bytes = amqp_cstring_bytes(persistent ? "persistent" : "transient"); client_properties_entries[3].key = amqp_cstring_bytes("connection started"); client_properties_entries[3].value.kind = AMQP_FIELD_KIND_UTF8; client_properties_entries[3].value.value.bytes = amqp_cstring_bytes(std_datetime); client_properties_table.entries = client_properties_entries; client_properties_table.num_entries = sizeof(client_properties_entries) / sizeof(amqp_table_entry_t); custom_properties_entries[0].key = amqp_cstring_bytes("client"); custom_properties_entries[0].value.kind = AMQP_FIELD_KIND_TABLE; custom_properties_entries[0].value.value.table = client_properties_table; if (params->connection_name) { custom_properties_entries[1].key = amqp_cstring_bytes("connection_name"); custom_properties_entries[1].value.kind = AMQP_FIELD_KIND_UTF8; custom_properties_entries[1].value.value.bytes = amqp_cstring_bytes(params->connection_name); } custom_properties_table.entries = custom_properties_entries; custom_properties_table.num_entries = params->connection_name ? 2 : 1; /* We can assume that connection established here but it is not true, real handshake goes during login */ assert(params->frame_max > 0); amqp_rpc_reply_t res = amqp_login_with_properties( resource->connection_state, params->vhost, params->channel_max, params->frame_max, params->heartbeat, &custom_properties_table, params->sasl_method, params->login, params->password ); efree(std_datetime); if (AMQP_RESPONSE_NORMAL != res.reply_type) { char *message = NULL, *long_message = NULL; php_amqp_connection_resource_error(res, &message, resource, 0); spprintf(&long_message, 0, "%s", message); zend_throw_exception(amqp_connection_exception_class_entry, long_message, PHP_AMQP_G(error_code)); efree(message); efree(long_message); /* https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf * * 2.2.4 The Connection Class: * ... a peer that detects an error MUST close the socket without sending any further data. * * 4.10.2 Denial of Service Attacks: * ... The general response to any exceptional condition in the connection negotiation is to pause that connection * (presumably a thread) for a period of several seconds and then to close the network connection. This * includes syntax errors, over-sized data, and failed attempts to authenticate. */ connection_resource_destructor(resource, persistent); return NULL; } /* Allocate space for the channel slots in the ring buffer */ resource->max_slots = (amqp_channel_t) amqp_get_channel_max(resource->connection_state); assert(resource->max_slots > 0); resource->slots = (amqp_channel_resource **) pecalloc(resource->max_slots + 1, sizeof(amqp_channel_object *), persistent); resource->is_connected = '\1'; return resource; } ZEND_RSRC_DTOR_FUNC(amqp_connection_resource_dtor_persistent) { amqp_connection_resource *resource = (amqp_connection_resource *) res->ptr; connection_resource_destructor(resource, 1); } ZEND_RSRC_DTOR_FUNC(amqp_connection_resource_dtor) { amqp_connection_resource *resource = (amqp_connection_resource *) res->ptr; connection_resource_destructor(resource, 0); } static void connection_resource_destructor(amqp_connection_resource *resource, int persistent) { assert(resource != NULL); #ifndef PHP_WIN32 void *old_handler; /* If we are trying to close the connection and the connection already closed, it will throw SIGPIPE, which is fine, so ignore all SIGPIPES */ /* Start ignoring SIGPIPE */ old_handler = signal(SIGPIPE, SIG_IGN); #endif if (resource->parent) { resource->parent->connection_resource = NULL; } if (resource->slots) { php_amqp_prepare_for_disconnect(resource); pefree(resource->slots, persistent); resource->slots = NULL; } /* connection may be closed in case of previous failure */ if (resource->is_connected) { amqp_connection_close(resource->connection_state, AMQP_REPLY_SUCCESS); } amqp_destroy_connection(resource->connection_state); #ifndef PHP_WIN32 /* End ignoring of SIGPIPEs */ signal(SIGPIPE, old_handler); #endif pefree(resource, persistent); } void php_amqp_prepare_for_disconnect(amqp_connection_resource *resource) { if (resource == NULL) { return; } if (resource->slots != NULL) { /* NOTE: when we have persistent connection we do not move channels between php requests * due to current php-amqp extension limitation in AMQPChannel where __construct == channel.open AMQP method call * and __destruct = channel.close AMQP method call */ /* Clean up old memory allocations which are now invalid (new connection) */ amqp_channel_t slot; for (slot = 0; slot < resource->max_slots; slot++) { if (resource->slots[slot] != 0) { php_amqp_close_channel(resource->slots[slot], 0); } } } /* If it's persistent connection do not destroy connection resource (this keep connection alive) */ if (resource->is_persistent) { /* Cleanup buffers to reduce memory usage in idle mode */ amqp_maybe_release_buffers(resource->connection_state); } return; } amqp-2.1.2/amqp_connection_resource.h0000644000076500000240000000761214553444052017472 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifndef PHP_AMQP_CONNECTION_RESOURCE_H #define PHP_AMQP_CONNECTION_RESOURCE_H #define PHP_AMQP_RESOURCE_RESPONSE_BREAK 1 #define PHP_AMQP_RESOURCE_RESPONSE_OK 0 #define PHP_AMQP_RESOURCE_RESPONSE_ERROR -1 #define PHP_AMQP_RESOURCE_RESPONSE_ERROR_CHANNEL_CLOSED -2 #define PHP_AMQP_RESOURCE_RESPONSE_ERROR_CONNECTION_CLOSED -3 extern int le_amqp_connection_resource; extern int le_amqp_connection_resource_persistent; #include "php_amqp.h" #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #else #include #endif void php_amqp_prepare_for_disconnect(amqp_connection_resource *resource); typedef struct _amqp_connection_params { char *login; char *password; char *host; char *vhost; int port; int channel_max; int frame_max; int heartbeat; double read_timeout; double write_timeout; double connect_timeout; double rpc_timeout; char *cacert; char *cert; char *key; int verify; int sasl_method; char *connection_name; } amqp_connection_params; /* Figure out what's going on connection and handle protocol exceptions, if any */ int php_amqp_connection_resource_error( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *resource, amqp_channel_t channel_id ); int php_amqp_connection_resource_error_advanced(amqp_rpc_reply_t reply, char **message, amqp_channel_object *channel); /* Socket-related functions */ int php_amqp_set_resource_read_timeout(amqp_connection_resource *resource, double read_timeout); int php_amqp_set_resource_write_timeout(amqp_connection_resource *resource, double write_timeout); /*Not socket-related rpc timeout function */ int php_amqp_set_resource_rpc_timeout(amqp_connection_resource *resource, double rpc_timeout); /* Channel-related functions */ amqp_channel_t php_amqp_connection_resource_get_available_channel_id(amqp_connection_resource *resource); int php_amqp_connection_resource_unregister_channel(amqp_connection_resource *resource, amqp_channel_t channel_id); int php_amqp_connection_resource_register_channel( amqp_connection_resource *resource, amqp_channel_resource *channel_resource, amqp_channel_t channel_id ); /* Creating and destroying resource */ amqp_connection_resource *connection_resource_constructor(amqp_connection_params *params, bool persistent); ZEND_RSRC_DTOR_FUNC(amqp_connection_resource_dtor_persistent); ZEND_RSRC_DTOR_FUNC(amqp_connection_resource_dtor); #endif amqp-2.1.2/amqp_decimal.c0000644000076500000240000001402214553444052015006 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "zend_exceptions.h" #include "php_amqp.h" #include "amqp_value.h" zend_class_entry *amqp_decimal_class_entry; #define this_ce amqp_decimal_class_entry static const zend_long AMQP_DECIMAL_EXPONENT_MIN = 0; static const zend_long AMQP_DECIMAL_EXPONENT_MAX = UINT8_MAX; static const zend_long AMQP_DECIMAL_SIGNIFICAND_MIN = 0; static const zend_long AMQP_DECIMAL_SIGNIFICAND_MAX = UINT32_MAX; /* {{{ proto AMQPDecimal::__construct(int $e, int $n) */ static PHP_METHOD(amqp_decimal_class, __construct) { zend_long exponent, significand; if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &exponent, &significand) == FAILURE) { RETURN_THROWS(); } if (exponent < AMQP_DECIMAL_EXPONENT_MIN) { zend_throw_exception_ex(amqp_value_exception_class_entry, 0, "Decimal exponent value must be unsigned."); return; } if (exponent > AMQP_DECIMAL_EXPONENT_MAX) { zend_throw_exception_ex( amqp_value_exception_class_entry, 0, "Decimal exponent value must be less than %u.", (unsigned) AMQP_DECIMAL_EXPONENT_MAX ); return; } if (significand < AMQP_DECIMAL_SIGNIFICAND_MIN) { zend_throw_exception_ex(amqp_value_exception_class_entry, 0, "Decimal significand value must be unsigned."); return; } if (significand > AMQP_DECIMAL_SIGNIFICAND_MAX) { zend_throw_exception_ex( amqp_value_exception_class_entry, 0, "Decimal significand value must be less than %u.", (unsigned) AMQP_DECIMAL_SIGNIFICAND_MAX ); return; } zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("exponent"), exponent); zend_update_property_long(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("significand"), significand); } /* }}} */ /* {{{ proto int AMQPDecimal::getExponent() Get exponent */ static PHP_METHOD(amqp_decimal_class, getExponent) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("exponent"); } /* }}} */ /* {{{ proto int AMQPDecimal::getSignificand() Get significand */ static PHP_METHOD(amqp_decimal_class, getSignificand) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("significand"); } /* }}} */ /* {{{ proto int AMQPDecimal::toAmqpValue() Get AMQPDecimal as AMQPValue */ static PHP_METHOD(amqp_decimal_class, toAmqpValue) { PHP_AMQP_NOPARAMS() RETURN_ZVAL(getThis(), 1, 0); } /* }}} */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_decimal_class_construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2) ZEND_ARG_TYPE_INFO(0, exponent, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, significand, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_decimal_class_getExponent, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_decimal_class_getSignificand, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_decimal_class_toAmqpValue, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) ZEND_END_ARG_INFO() zend_function_entry amqp_decimal_class_functions[] = { PHP_ME(amqp_decimal_class, __construct, arginfo_amqp_decimal_class_construct, ZEND_ACC_PUBLIC) PHP_ME(amqp_decimal_class, getExponent, arginfo_amqp_decimal_class_getExponent, ZEND_ACC_PUBLIC) PHP_ME(amqp_decimal_class, getSignificand, arginfo_amqp_decimal_class_getSignificand, ZEND_ACC_PUBLIC) PHP_ME(amqp_decimal_class, toAmqpValue, arginfo_amqp_decimal_class_toAmqpValue, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_decimal) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPDecimal", amqp_decimal_class_functions); this_ce = zend_register_internal_class(&ce); zend_class_implements(this_ce, 1, amqp_value_class_entry); this_ce->ce_flags |= ZEND_ACC_FINAL; #if PHP_VERSION_ID >= 80200 this_ce->ce_flags |= ZEND_ACC_READONLY_CLASS; #endif zend_declare_class_constant_long(this_ce, ZEND_STRL("EXPONENT_MIN"), AMQP_DECIMAL_EXPONENT_MIN); zend_declare_class_constant_long(this_ce, ZEND_STRL("EXPONENT_MAX"), AMQP_DECIMAL_EXPONENT_MAX); zend_declare_class_constant_long(this_ce, ZEND_STRL("SIGNIFICAND_MIN"), AMQP_DECIMAL_SIGNIFICAND_MIN); zend_declare_class_constant_long(this_ce, ZEND_STRL("SIGNIFICAND_MAX"), AMQP_DECIMAL_SIGNIFICAND_MAX); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "exponent", ZEND_ACC_PRIVATE, IS_LONG, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "significand", ZEND_ACC_PRIVATE, IS_LONG, 0); return SUCCESS; } amqp-2.1.2/amqp_decimal.h0000644000076500000240000000311214553444052015011 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_decimal_class_entry; PHP_MINIT_FUNCTION(amqp_decimal); amqp-2.1.2/amqp_envelope.c0000644000076500000240000002323214553444052015230 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #else #include #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif #include "amqp_envelope.h" #include "amqp_basic_properties.h" #include "php_amqp.h" zend_class_entry *amqp_envelope_class_entry; #define this_ce amqp_envelope_class_entry void convert_amqp_envelope_to_zval(amqp_envelope_t *amqp_envelope, zval *envelope) { /* Build the envelope */ object_init_ex(envelope, this_ce); amqp_basic_properties_t *p = &amqp_envelope->message.properties; amqp_message_t *message = &amqp_envelope->message; zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(envelope), ZEND_STRL("body"), (const char *) message->body.bytes, (size_t) message->body.len ); zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(envelope), ZEND_STRL("consumerTag"), (const char *) amqp_envelope->consumer_tag.bytes, (size_t) amqp_envelope->consumer_tag.len ); zend_update_property_long( this_ce, PHP_AMQP_COMPAT_OBJ_P(envelope), ZEND_STRL("deliveryTag"), (zend_long) amqp_envelope->delivery_tag ); zend_update_property_bool( this_ce, PHP_AMQP_COMPAT_OBJ_P(envelope), ZEND_STRL("isRedelivery"), (zend_long) amqp_envelope->redelivered ); zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(envelope), ZEND_STRL("exchangeName"), (const char *) amqp_envelope->exchange.bytes, (size_t) amqp_envelope->exchange.len ); zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(envelope), ZEND_STRL("routingKey"), (const char *) amqp_envelope->routing_key.bytes, (size_t) amqp_envelope->routing_key.len ); php_amqp_basic_properties_extract(p, envelope); } /* {{{ proto AMQPEnvelope::__construct() */ static PHP_METHOD(amqp_envelope_class, __construct) { PHP_AMQP_NOPARAMS() /* BC */ php_amqp_basic_properties_set_empty_headers(getThis()); } /* }}} */ /* {{{ proto AMQPEnvelope::getBody()*/ static PHP_METHOD(amqp_envelope_class, getBody) { zval rv; PHP_AMQP_NOPARAMS() zval *zv = PHP_AMQP_READ_THIS_PROP("body"); if (Z_STRLEN_P(zv) == 0) { RETURN_STRING(""); } RETURN_ZVAL(zv, 1, 0); } /* }}} */ /* {{{ proto AMQPEnvelope::getRoutingKey() */ static PHP_METHOD(amqp_envelope_class, getRoutingKey) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("routingKey"); } /* }}} */ /* {{{ proto AMQPEnvelope::getDeliveryTag() */ static PHP_METHOD(amqp_envelope_class, getDeliveryTag) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("deliveryTag"); } /* }}} */ /* {{{ proto AMQPEnvelope::getConsumerTag() */ static PHP_METHOD(amqp_envelope_class, getConsumerTag) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("consumerTag"); } /* }}} */ /* {{{ proto AMQPEnvelope::getExchangeName() */ static PHP_METHOD(amqp_envelope_class, getExchangeName) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("exchangeName"); } /* }}} */ /* {{{ proto AMQPEnvelope::isRedelivery() */ static PHP_METHOD(amqp_envelope_class, isRedelivery) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("isRedelivery"); } /* }}} */ /* {{{ proto AMQPEnvelope::getHeader(string name) */ static PHP_METHOD(amqp_envelope_class, getHeader) { zval rv; char *key; size_t key_len; zval *tmp = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } zval *zv = PHP_AMQP_READ_THIS_PROP_CE("headers", amqp_basic_properties_class_entry); /* Look for the hash key */ if ((tmp = zend_hash_str_find(HASH_OF(zv), key, key_len)) == NULL) { RETURN_NULL(); } RETURN_ZVAL(tmp, 1, 0); } /* }}} */ /* {{{ proto AMQPEnvelope::hasHeader(string name) */ static PHP_METHOD(amqp_envelope_class, hasHeader) { zval rv; char *key; size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } zval *zv = PHP_AMQP_READ_THIS_PROP_CE("headers", amqp_basic_properties_class_entry); /* Look for the hash key */ RETURN_BOOL(zend_hash_str_find(HASH_OF(zv), key, key_len) != NULL); } /* }}} */ /* amqp_envelope_class ARG_INFO definition */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_getBody, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_getRoutingKey, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_getConsumerTag, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_getDeliveryTag, ZEND_SEND_BY_VAL, 0, IS_LONG, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_getExchangeName, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_isRedelivery, ZEND_SEND_BY_VAL, 0, _IS_BOOL, 0) ZEND_END_ARG_INFO() #ifdef IS_MIXED ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_getHeader, ZEND_SEND_BY_VAL, 1, IS_MIXED, 1) #else /* PHP < 8.0 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_envelope_class_getHeader, 0, 0, 1) #endif ZEND_ARG_TYPE_INFO(0, headerName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_envelope_class_hasHeader, ZEND_SEND_BY_VAL, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, headerName, IS_STRING, 0) ZEND_END_ARG_INFO() zend_function_entry amqp_envelope_class_functions[] = { PHP_ME(amqp_envelope_class, __construct, arginfo_amqp_envelope_class__construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR) PHP_ME(amqp_envelope_class, getBody, arginfo_amqp_envelope_class_getBody, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, getRoutingKey, arginfo_amqp_envelope_class_getRoutingKey, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, getConsumerTag, arginfo_amqp_envelope_class_getConsumerTag, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, getDeliveryTag, arginfo_amqp_envelope_class_getDeliveryTag, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, getExchangeName, arginfo_amqp_envelope_class_getExchangeName, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, isRedelivery, arginfo_amqp_envelope_class_isRedelivery, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, getHeader, arginfo_amqp_envelope_class_getHeader, ZEND_ACC_PUBLIC) PHP_ME(amqp_envelope_class, hasHeader, arginfo_amqp_envelope_class_hasHeader, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_envelope) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPEnvelope", amqp_envelope_class_functions); this_ce = zend_register_internal_class_ex(&ce, amqp_basic_properties_class_entry); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "body", ZEND_ACC_PRIVATE, IS_STRING, 0, ZVAL_EMPTY_STRING); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "consumerTag", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "deliveryTag", ZEND_ACC_PRIVATE, IS_LONG, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "isRedelivery", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "exchangeName", ZEND_ACC_PRIVATE, IS_STRING, 1, ZVAL_NULL); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT( this_ce, "routingKey", ZEND_ACC_PRIVATE, IS_STRING, 0, ZVAL_EMPTY_STRING ); return SUCCESS; } amqp-2.1.2/amqp_envelope.h0000644000076500000240000000324614553444052015240 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php_amqp.h" extern zend_class_entry *amqp_envelope_class_entry; void convert_amqp_envelope_to_zval(amqp_envelope_t *amqp_envelope, zval *envelope); PHP_MINIT_FUNCTION(amqp_envelope); amqp-2.1.2/amqp_envelope_exception.c0000644000076500000240000000542014553444052017305 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "zend_exceptions.h" #include "php_amqp.h" zend_class_entry *amqp_envelope_exception_class_entry; #define this_ce amqp_envelope_exception_class_entry /* {{{ proto float AMQPEnvelopeException::getEnvelope() Get AMQPEnvelope object */ static PHP_METHOD(amqp_envelope_exception_class, getEnvelope) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("envelope"); } /* }}} */ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX( arginfo_amqp_envelope_exception_class_getEnvelope, ZEND_SEND_BY_VAL, 0, AMQPEnvelope, 0 ) ZEND_END_ARG_INFO() zend_function_entry amqp_envelope_exception_class_functions[] = { PHP_ME(amqp_envelope_exception_class, getEnvelope, arginfo_amqp_envelope_exception_class_getEnvelope, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_envelope_exception) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPEnvelopeException", amqp_envelope_exception_class_functions); amqp_envelope_exception_class_entry = zend_register_internal_class_ex(&ce, amqp_exception_class_entry); PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ( amqp_envelope_exception_class_entry, "envelope", ZEND_ACC_PRIVATE, AMQPEnvelope, 0 ); return SUCCESS; } amqp-2.1.2/amqp_envelope_exception.h0000644000076500000240000000314014553444052017307 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_envelope_exception_class_entry; PHP_MINIT_FUNCTION(amqp_envelope_exception); amqp-2.1.2/amqp_exchange.c0000644000076500000240000010004414553444052015172 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #else #include #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif #include "php_amqp.h" #include "amqp_connection.h" #include "amqp_channel.h" #include "amqp_exchange.h" #include "amqp_type.h" zend_class_entry *amqp_exchange_class_entry; #define this_ce amqp_exchange_class_entry /* {{{ proto AMQPExchange::__construct(AMQPChannel channel); create Exchange */ static PHP_METHOD(amqp_exchange_class, __construct) { zval rv; zval arguments; zval *channelObj; amqp_channel_resource *channel_resource; if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &channelObj, amqp_channel_class_entry) == FAILURE) { RETURN_THROWS(); } ZVAL_UNDEF(&arguments); array_init(&arguments); zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("arguments"), &arguments); zval_ptr_dtor(&arguments); channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(channelObj); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not create exchange."); zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("channel"), channelObj); zend_update_property( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connection"), PHP_AMQP_READ_OBJ_PROP(amqp_channel_class_entry, channelObj, "connection") ); } /* }}} */ /* {{{ proto AMQPExchange::getName() Get the exchange name */ static PHP_METHOD(amqp_exchange_class, getName) { zval rv; PHP_AMQP_NOPARAMS() if (PHP_AMQP_READ_THIS_PROP_STRLEN("name") > 0) { PHP_AMQP_RETURN_THIS_PROP("name"); } else { RETURN_NULL(); } } /* }}} */ /* {{{ proto AMQPExchange::setName(string name) Set the exchange name */ static PHP_METHOD(amqp_exchange_class, setName) { char *name = NULL; size_t name_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &name, &name_len) == FAILURE) { RETURN_THROWS(); } /* Verify that the name is not null and not an empty string */ if (name_len > 255) { zend_throw_exception( amqp_exchange_exception_class_entry, "Invalid exchange name given, must be less than 255 characters long.", 0 ); return; } /* Set the exchange name */ zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("name"), name, name_len); } /* }}} */ /* {{{ proto AMQPExchange::getFlags() Get the exchange parameters */ static PHP_METHOD(amqp_exchange_class, getFlags) { zval rv; zend_long flags = AMQP_NOPARAM; PHP_AMQP_NOPARAMS() if (PHP_AMQP_READ_THIS_PROP_BOOL("passive")) { flags |= AMQP_PASSIVE; } if (PHP_AMQP_READ_THIS_PROP_BOOL("durable")) { flags |= AMQP_DURABLE; } if (PHP_AMQP_READ_THIS_PROP_BOOL("autoDelete")) { flags |= AMQP_AUTODELETE; } if (PHP_AMQP_READ_THIS_PROP_BOOL("internal")) { flags |= AMQP_INTERNAL; } RETURN_LONG(flags); } /* }}} */ /* {{{ proto AMQPExchange::setFlags(long bitmask) Set the exchange parameters */ static PHP_METHOD(amqp_exchange_class, setFlags) { zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l!", &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } flags = flags & PHP_AMQP_EXCHANGE_FLAGS; zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("passive"), IS_PASSIVE(flags)); zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("durable"), IS_DURABLE(flags)); zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("autoDelete"), IS_AUTODELETE(flags)); zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("internal"), IS_INTERNAL(flags)); } /* }}} */ /* {{{ proto AMQPExchange::getType() Get the exchange type */ static PHP_METHOD(amqp_exchange_class, getType) { zval rv; PHP_AMQP_NOPARAMS() if (PHP_AMQP_READ_THIS_PROP_STRLEN("type") > 0) { PHP_AMQP_RETURN_THIS_PROP("type"); } else { RETURN_NULL(); } } /* }}} */ /* {{{ proto AMQPExchange::setType(string type) Set the exchange type */ static PHP_METHOD(amqp_exchange_class, setType) { char *type = NULL; size_t type_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!", &type, &type_len) == FAILURE) { RETURN_THROWS(); } zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("type"), type, type_len); } /* }}} */ /* {{{ proto AMQPExchange::getArgument(string key) Get the exchange argument referenced by key */ static PHP_METHOD(amqp_exchange_class, getArgument) { zval rv; zval *tmp = NULL; char *key; size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } if ((tmp = zend_hash_str_find(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len)) == NULL) { zend_throw_exception_ex(amqp_exchange_exception_class_entry, 0, "The argument \"%s\" does not exist", key); return; } RETURN_ZVAL(tmp, 1, 0); } /* }}} */ /* {{{ proto AMQPExchange::hasArgument(string key) */ static PHP_METHOD(amqp_exchange_class, hasArgument) { zval rv; char *key; size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } RETURN_BOOL(zend_hash_str_find(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len) != NULL); } /* }}} */ /* {{{ proto AMQPExchange::getArguments Get the exchange arguments */ static PHP_METHOD(amqp_exchange_class, getArguments) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("arguments"); } /* }}} */ /* {{{ proto AMQPExchange::setArguments(array args) Overwrite all exchange arguments with given args */ static PHP_METHOD(amqp_exchange_class, setArguments) { zval *zvalArguments; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/", &zvalArguments) == FAILURE) { RETURN_THROWS(); } zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("arguments"), zvalArguments); } /* }}} */ /* {{{ proto AMQPExchange::setArgument(key, value) */ static PHP_METHOD(amqp_exchange_class, setArgument) { zval rv; char *key = NULL; size_t key_len = 0; zval *value = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &key, &key_len, &value) == FAILURE) { RETURN_THROWS(); } switch (Z_TYPE_P(value)) { case IS_NULL: case IS_TRUE: case IS_FALSE: case IS_LONG: case IS_DOUBLE: case IS_STRING: zend_hash_str_add(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len, value); Z_TRY_ADDREF_P(value); break; default: zend_throw_exception( amqp_exchange_exception_class_entry, "The value parameter must be of type NULL, int, double or string.", 0 ); return; } } /* }}} */ /* {{{ proto AMQPExchange::removeArgument(key) */ static PHP_METHOD(amqp_exchange_class, removeArgument) { zval rv; char *key = NULL; size_t key_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } zend_hash_str_del(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len); } /* }}} */ /* {{{ proto AMQPExchange::declareExchange(); declare Exchange */ static PHP_METHOD(amqp_exchange_class, declareExchange) { zval rv; amqp_channel_resource *channel_resource; amqp_table_t *arguments; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not declare exchange."); /* Check that the exchange has a name */ if (PHP_AMQP_READ_THIS_PROP_STRLEN("name") < 1) { zend_throw_exception( amqp_exchange_exception_class_entry, "Could not declare exchange. Exchanges must have a name.", 0 ); return; } /* Check that the exchange has a name */ if (PHP_AMQP_READ_THIS_PROP_STRLEN("type") < 1) { zend_throw_exception( amqp_exchange_exception_class_entry, "Could not declare exchange. Exchanges must have a type.", 0 ); return; } arguments = php_amqp_type_convert_zval_to_amqp_table(PHP_AMQP_READ_THIS_PROP("arguments")); amqp_exchange_declare( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STR("name")), amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STR("type")), PHP_AMQP_READ_THIS_PROP_BOOL("passive"), PHP_AMQP_READ_THIS_PROP_BOOL("durable"), PHP_AMQP_READ_THIS_PROP_BOOL("autoDelete"), PHP_AMQP_READ_THIS_PROP_BOOL("internal"), *arguments ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_type_free_amqp_table(arguments); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_exchange_exception_class_entry); return; } } /* }}} */ /* {{{ proto AMQPExchange::delete([string name[, long params]]); delete Exchange */ static PHP_METHOD(amqp_exchange_class, delete) { zval rv; amqp_channel_resource *channel_resource; char *name = NULL; size_t name_len = 0; zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!l!", &name, &name_len, &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not delete exchange."); amqp_exchange_delete( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes( name_len ? name : PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : "" ), (AMQP_IFUNUSED & flags) ? 1 : 0 ); amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_exchange_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto AMQPExchange::publish(string msg, [string key, [int flags, [array headers]]]); publish into Exchange */ static PHP_METHOD(amqp_exchange_class, publish) { zval rv; zval *ini_arr = NULL; zval *tmp = NULL; amqp_channel_resource *channel_resource; char *key_name = NULL; size_t key_len = 0; char *msg = NULL; size_t msg_len = 0; zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; #ifndef PHP_WIN32 /* Storage for previous signal handler during SIGPIPE override */ void *old_handler; #endif amqp_basic_properties_t props; if (zend_parse_parameters( ZEND_NUM_ARGS(), "s|s!l!a/", &msg, &msg_len, &key_name, &key_len, &flags, &flags_is_null, &ini_arr ) == FAILURE) { RETURN_THROWS(); } /* By default (and for BC) content type is text/plain (may be skipped at all, then set props._flags to 0) */ props.content_type = amqp_cstring_bytes("text/plain"); props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG; props.headers.entries = 0; { if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("content_type"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.content_type = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_CONTENT_TYPE_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("content_encoding"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.content_encoding = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_CONTENT_ENCODING_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("message_id"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.message_id = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_MESSAGE_ID_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("user_id"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.user_id = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_USER_ID_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("app_id"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.app_id = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_APP_ID_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("delivery_mode"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_long(tmp); props.delivery_mode = (uint8_t) Z_LVAL_P(tmp); props._flags |= AMQP_BASIC_DELIVERY_MODE_FLAG; } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("priority"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_long(tmp); props.priority = (uint8_t) Z_LVAL_P(tmp); props._flags |= AMQP_BASIC_PRIORITY_FLAG; } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("timestamp"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_long(tmp); props.timestamp = (uint64_t) Z_LVAL_P(tmp); props._flags |= AMQP_BASIC_TIMESTAMP_FLAG; } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("expiration"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.expiration = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_EXPIRATION_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("type"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.type = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_TYPE_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("reply_to"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.reply_to = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_REPLY_TO_FLAG; } } if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("correlation_id"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_string(tmp); if (Z_STRLEN_P(tmp) > 0) { props.correlation_id = amqp_cstring_bytes(Z_STRVAL_P(tmp)); props._flags |= AMQP_BASIC_CORRELATION_ID_FLAG; } } } amqp_table_t *headers = NULL; if (ini_arr && (tmp = zend_hash_str_find(HASH_OF(ini_arr), ZEND_STRL("headers"))) != NULL) { SEPARATE_ZVAL(tmp); convert_to_array(tmp); headers = php_amqp_type_convert_zval_to_amqp_table(tmp); props._flags |= AMQP_BASIC_HEADERS_FLAG; props.headers = *headers; } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not publish to exchange."); #ifndef PHP_WIN32 /* Start ignoring SIGPIPE */ old_handler = signal(SIGPIPE, SIG_IGN); #endif zval *exchange_name = PHP_AMQP_READ_THIS_PROP("name"); /* NOTE: basic.publish is asynchronous and thus will not indicate failure if something goes wrong on the broker */ int status = amqp_basic_publish( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (Z_TYPE_P(exchange_name) == IS_STRING && Z_STRLEN_P(exchange_name) > 0 ? amqp_cstring_bytes(Z_STRVAL_P(exchange_name)) : amqp_empty_bytes), /* exchange */ (key_len > 0 ? amqp_cstring_bytes(key_name) : amqp_empty_bytes), /* routing key */ (AMQP_MANDATORY & flags) ? 1 : 0, /* mandatory */ (AMQP_IMMEDIATE & flags) ? 1 : 0, /* immediate */ &props, php_amqp_type_char_to_amqp_long(msg, msg_len) /* message body */ ); if (headers) { php_amqp_type_free_amqp_table(headers); } #ifndef PHP_WIN32 /* End ignoring of SIGPIPEs */ signal(SIGPIPE, old_handler); #endif if (status != AMQP_STATUS_OK) { /* Emulate library error */ amqp_rpc_reply_t res; res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_exchange_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } } /* }}} */ /* {{{ proto int exchange::bind(string srcExchangeName[, string routingKey, array arguments]); bind exchange to exchange by routing key */ static PHP_METHOD(amqp_exchange_class, bind) { zval rv; zval *zvalArguments = NULL; amqp_channel_resource *channel_resource; char *src_name; size_t src_name_len = 0; char *keyname = NULL; size_t keyname_len = 0; amqp_table_t *arguments = NULL; if (zend_parse_parameters( ZEND_NUM_ARGS(), "s|s!a", &src_name, &src_name_len, &keyname, &keyname_len, &zvalArguments ) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not bind to exchange."); if (zvalArguments) { arguments = php_amqp_type_convert_zval_to_amqp_table(zvalArguments); } amqp_exchange_bind( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (src_name_len > 0 ? amqp_cstring_bytes(src_name) : amqp_empty_bytes), (keyname != NULL && keyname_len > 0 ? amqp_cstring_bytes(keyname) : amqp_empty_bytes), (arguments ? *arguments : amqp_empty_table) ); if (arguments) { php_amqp_type_free_amqp_table(arguments); } amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_exchange_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto int exchange::unbind(string srcExchangeName[, string routingKey, array arguments]); remove exchange to exchange binding by routing key */ static PHP_METHOD(amqp_exchange_class, unbind) { zval rv; zval *zvalArguments = NULL; amqp_channel_resource *channel_resource; char *src_name; size_t src_name_len = 0; char *keyname = NULL; size_t keyname_len = 0; amqp_table_t *arguments = NULL; if (zend_parse_parameters( ZEND_NUM_ARGS(), "s|s!a", &src_name, &src_name_len, &keyname, &keyname_len, &zvalArguments ) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not unbind from exchange."); if (zvalArguments) { arguments = php_amqp_type_convert_zval_to_amqp_table(zvalArguments); } amqp_exchange_unbind( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (src_name_len > 0 ? amqp_cstring_bytes(src_name) : amqp_empty_bytes), (keyname != NULL && keyname_len > 0 ? amqp_cstring_bytes(keyname) : amqp_empty_bytes), (arguments ? *arguments : amqp_empty_table) ); if (arguments) { php_amqp_type_free_amqp_table(arguments); } amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_exchange_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto AMQPExchange::getChannel() Get the AMQPChannel object in use */ static PHP_METHOD(amqp_exchange_class, getChannel) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("channel"); } /* }}} */ /* {{{ proto AMQPExchange::getConnection() Get the AMQPConnection object in use */ static PHP_METHOD(amqp_exchange_class, getConnection) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("connection"); } /* }}} */ /* amqp_exchange ARG_INFO definition */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_exchange_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_OBJ_INFO(0, channel, AMQPChannel, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_getName, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_setName, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, exchangeName, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_getFlags, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_setFlags, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_getType, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_setType, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, exchangeType, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_exchange_class_getArgument, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_hasArgument, ZEND_SEND_BY_VAL, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_getArguments, ZEND_SEND_BY_VAL, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_setArgument, ZEND_SEND_BY_VAL, 2, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_ARG_INFO(0, argumentValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_removeArgument, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_setArguments, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_ARRAY_INFO(0, arguments, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_declareExchange, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_bind, ZEND_RETURN_VALUE, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, exchangeName, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, routingKey, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arguments, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_unbind, ZEND_RETURN_VALUE, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, exchangeName, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, routingKey, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arguments, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_delete, ZEND_RETURN_VALUE, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, exchangeName, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_exchange_class_publish, ZEND_RETURN_VALUE, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, message, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, routingKey, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, headers, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO(arginfo_amqp_exchange_class_getChannel, AMQPChannel, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO(arginfo_amqp_exchange_class_getConnection, AMQPConnection, 0) ZEND_END_ARG_INFO() zend_function_entry amqp_exchange_class_functions[] = { PHP_ME(amqp_exchange_class, __construct, arginfo_amqp_exchange_class__construct, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getName, arginfo_amqp_exchange_class_getName, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, setName, arginfo_amqp_exchange_class_setName, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getFlags, arginfo_amqp_exchange_class_getFlags, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, setFlags, arginfo_amqp_exchange_class_setFlags, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getType, arginfo_amqp_exchange_class_getType, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, setType, arginfo_amqp_exchange_class_setType, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getArgument, arginfo_amqp_exchange_class_getArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getArguments, arginfo_amqp_exchange_class_getArguments, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, setArgument, arginfo_amqp_exchange_class_setArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, removeArgument, arginfo_amqp_exchange_class_removeArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, setArguments, arginfo_amqp_exchange_class_setArguments, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, hasArgument, arginfo_amqp_exchange_class_hasArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, declareExchange, arginfo_amqp_exchange_class_declareExchange, ZEND_ACC_PUBLIC) PHP_MALIAS(amqp_exchange_class, declare, declareExchange, arginfo_amqp_exchange_class_declareExchange, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, bind, arginfo_amqp_exchange_class_bind, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, unbind, arginfo_amqp_exchange_class_unbind, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, delete, arginfo_amqp_exchange_class_delete, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, publish, arginfo_amqp_exchange_class_publish, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getChannel, arginfo_amqp_exchange_class_getChannel, ZEND_ACC_PUBLIC) PHP_ME(amqp_exchange_class, getConnection, arginfo_amqp_exchange_class_getConnection, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_exchange) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPExchange", amqp_exchange_class_functions); this_ce = zend_register_internal_class(&ce); PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ(this_ce, "connection", ZEND_ACC_PRIVATE, AMQPConnection, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ(this_ce, "channel", ZEND_ACC_PRIVATE, AMQPChannel, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "name", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "type", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "passive", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "durable", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "autoDelete", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "internal", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); #if PHP_VERSION_ID >= 80000 PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "arguments", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_EMPTY_ARRAY); #else PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "arguments", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_NULL); #endif return SUCCESS; } amqp-2.1.2/amqp_exchange.h0000644000076500000240000000311414553444052015177 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_exchange_class_entry; PHP_MINIT_FUNCTION(amqp_exchange); amqp-2.1.2/amqp_methods_handling.c0000644000076500000240000002020714553444052016721 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "amqp_basic_properties.h" #include "amqp_methods_handling.h" /* taken from rabbbitmq-c */ static int amqp_id_in_reply_list(amqp_method_number_t expected, amqp_method_number_t *list) { while (*list != 0) { if (*list == expected) { return 1; } list++; } return 0; } /* taken from rabbbitmq-c */ int amqp_simple_wait_method_list_noblock( amqp_connection_state_t state, amqp_channel_t expected_channel, amqp_method_number_t *expected_methods, amqp_method_t *output, struct timeval *timeout ) { amqp_frame_t frame; int res = amqp_simple_wait_frame_noblock(state, &frame, timeout); if (AMQP_STATUS_OK != res) { return res; } if (AMQP_FRAME_METHOD != frame.frame_type || expected_channel != frame.channel || !amqp_id_in_reply_list(frame.payload.method.id, expected_methods)) { if (AMQP_CHANNEL_CLOSE_METHOD == frame.payload.method.id || AMQP_CONNECTION_CLOSE_METHOD == frame.payload.method.id) { *output = frame.payload.method; return AMQP_RESPONSE_SERVER_EXCEPTION; } return AMQP_STATUS_WRONG_METHOD; } *output = frame.payload.method; return AMQP_STATUS_OK; } /* taken from rabbbitmq-c */ int amqp_simple_wait_method_noblock( amqp_connection_state_t state, amqp_channel_t expected_channel, amqp_method_number_t expected_method, amqp_method_t *output, struct timeval *timeout ) { amqp_method_number_t expected_methods[] = {0, 0}; expected_methods[0] = expected_method; return amqp_simple_wait_method_list_noblock(state, expected_channel, expected_methods, output, timeout); } int php_amqp_handle_basic_return(char **message, amqp_channel_object *channel, amqp_method_t *method) { amqp_rpc_reply_t ret; amqp_message_t msg; int status = PHP_AMQP_RESOURCE_RESPONSE_OK; assert(AMQP_BASIC_RETURN_METHOD == method->id); amqp_basic_return_t *m = (amqp_basic_return_t *) method->decoded; ret = amqp_read_message( channel->channel_resource->connection_resource->connection_state, channel->channel_resource->channel_id, &msg, 0 ); if (AMQP_RESPONSE_NORMAL != ret.reply_type) { return php_amqp_connection_resource_error( ret, message, channel->channel_resource->connection_resource, channel->channel_resource->channel_id ); } if (channel->callbacks.basic_return.fci.size > 0) { status = php_amqp_call_basic_return_callback(m, &msg, &channel->callbacks.basic_return); } else { zend_error( E_NOTICE, "Unhandled basic.return method from server received. Use AMQPChannel::setReturnCallback() to process it." ); status = PHP_AMQP_RESOURCE_RESPONSE_BREAK; } amqp_destroy_message(&msg); return status; } int php_amqp_call_basic_return_callback(amqp_basic_return_t *m, amqp_message_t *msg, amqp_callback_bucket *cb) { zval params; zval basic_properties; int status = PHP_AMQP_RESOURCE_RESPONSE_OK; ZVAL_UNDEF(¶ms); array_init(¶ms); ZVAL_UNDEF(&basic_properties); /* callback(int $reply_code, string $reply_text, string $exchange, string $routing_key, AMQPBasicProperties $properties, string $body); */ add_next_index_long(¶ms, (zend_long) m->reply_code); add_next_index_stringl(¶ms, m->reply_text.bytes, m->reply_text.len); add_next_index_stringl(¶ms, m->exchange.bytes, m->exchange.len); add_next_index_stringl(¶ms, m->routing_key.bytes, m->routing_key.len); php_amqp_basic_properties_to_zval(&msg->properties, &basic_properties); add_next_index_zval(¶ms, &basic_properties); Z_ADDREF_P(&basic_properties); add_next_index_stringl(¶ms, msg->body.bytes, msg->body.len); status = php_amqp_call_callback_with_params(params, cb); zval_ptr_dtor(&basic_properties); return status; } int php_amqp_handle_basic_ack(char **message, amqp_channel_object *channel, amqp_method_t *method) { assert(AMQP_BASIC_ACK_METHOD == method->id); amqp_basic_ack_t *m = (amqp_basic_ack_t *) method->decoded; if (channel->callbacks.basic_ack.fci.size > 0) { return php_amqp_call_basic_ack_callback(m, &channel->callbacks.basic_ack); } zend_error( E_NOTICE, "Unhandled basic.ack method from server received. Use AMQPChannel::setConfirmCallback() to process it." ); return PHP_AMQP_RESOURCE_RESPONSE_BREAK; } int php_amqp_call_basic_ack_callback(amqp_basic_ack_t *m, amqp_callback_bucket *cb) { zval params; ZVAL_UNDEF(¶ms); array_init(¶ms); /* callback(int $delivery_tag, bool $multiple); */ add_next_index_long(¶ms, (zend_long) m->delivery_tag); add_next_index_bool(¶ms, m->multiple); return php_amqp_call_callback_with_params(params, cb); } int php_amqp_handle_basic_nack(char **message, amqp_channel_object *channel, amqp_method_t *method) { int status = PHP_AMQP_RESOURCE_RESPONSE_OK; assert(AMQP_BASIC_NACK_METHOD == method->id); amqp_basic_nack_t *m = (amqp_basic_nack_t *) method->decoded; if (channel->callbacks.basic_nack.fci.size > 0) { status = php_amqp_call_basic_nack_callback(m, &channel->callbacks.basic_nack); } else { zend_error( E_NOTICE, "Unhandled basic.nack method from server received. Use AMQPChannel::setConfirmCallback() to process it." ); status = PHP_AMQP_RESOURCE_RESPONSE_BREAK; } return status; } int php_amqp_call_basic_nack_callback(amqp_basic_nack_t *m, amqp_callback_bucket *cb) { zval params; ZVAL_UNDEF(¶ms); array_init(¶ms); /* callback(int $delivery_tag, bool $multiple, bool $requeue); */ add_next_index_long(¶ms, (zend_long) m->delivery_tag); add_next_index_bool(¶ms, m->multiple); add_next_index_bool(¶ms, m->requeue); return php_amqp_call_callback_with_params(params, cb); } int php_amqp_call_callback_with_params(zval params, amqp_callback_bucket *cb) { zval retval; zval *retval_ptr = &retval; int status = PHP_AMQP_RESOURCE_RESPONSE_OK; ZVAL_NULL(&retval); /* Convert everything to be callable */ zend_fcall_info_args(&cb->fci, ¶ms); /* Initialize the return value pointer */ cb->fci.retval = retval_ptr; zend_call_function(&cb->fci, &cb->fcc); /* Check if user land function wants to bail */ if (EG(exception) || Z_TYPE_P(retval_ptr) == IS_FALSE) { status = PHP_AMQP_RESOURCE_RESPONSE_BREAK; } /* Clean up our mess */ zend_fcall_info_args_clear(&cb->fci, 1); zval_ptr_dtor(¶ms); zval_ptr_dtor(retval_ptr); return status; } amqp-2.1.2/amqp_methods_handling.h0000644000076500000240000000541014553444052016725 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifndef PHP_AMQP_METHODS_HANDLING_H #define PHP_AMQP_METHODS_HANDLING_H #include "php_amqp.h" #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #else #include #endif #include "php.h" int amqp_simple_wait_method_list_noblock( amqp_connection_state_t state, amqp_channel_t expected_channel, amqp_method_number_t *expected_methods, amqp_method_t *output, struct timeval *timeout ); int amqp_simple_wait_method_noblock( amqp_connection_state_t state, amqp_channel_t expected_channel, amqp_method_number_t expected_method, amqp_method_t *output, struct timeval *timeout ); int php_amqp_call_callback_with_params(zval params, amqp_callback_bucket *cb); int php_amqp_call_basic_return_callback(amqp_basic_return_t *m, amqp_message_t *msg, amqp_callback_bucket *cb); int php_amqp_handle_basic_return(char **message, amqp_channel_object *channel, amqp_method_t *method); int php_amqp_call_basic_ack_callback(amqp_basic_ack_t *m, amqp_callback_bucket *cb); int php_amqp_handle_basic_ack(char **message, amqp_channel_object *channel, amqp_method_t *method); int php_amqp_call_basic_nack_callback(amqp_basic_nack_t *m, amqp_callback_bucket *cb); int php_amqp_handle_basic_nack(char **message, amqp_channel_object *channel, amqp_method_t *method); #endif amqp-2.1.2/amqp_queue.c0000644000076500000240000014143014553444052014540 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "zend_exceptions.h" #ifdef PHP_WIN32 #if PHP_VERSION_ID >= 80000 #include #else #include "win32/php_stdint.h" #endif #include "win32/signal.h" #else #include #include #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #include #else #include #include #endif #ifdef PHP_WIN32 #include "win32/unistd.h" #else #include #endif #include "php_amqp.h" #include "amqp_envelope.h" #include "amqp_envelope_exception.h" #include "amqp_connection.h" #include "amqp_channel.h" #include "amqp_connection.h" #include "amqp_envelope.h" #include "amqp_queue.h" #include "amqp_type.h" #include "amqp_value.h" #include "amqp_decimal.h" #include "amqp_timestamp.h" zend_class_entry *amqp_queue_class_entry; #define this_ce amqp_queue_class_entry /* {{{ proto AMQPQueue::__construct(AMQPChannel channel) AMQPQueue constructor */ static PHP_METHOD(amqp_queue_class, __construct) { zval rv; zval arguments; zval *channelObj; amqp_channel_resource *channel_resource; if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &channelObj, amqp_channel_class_entry) == FAILURE) { RETURN_THROWS(); } ZVAL_UNDEF(&arguments); array_init(&arguments); zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("arguments"), &arguments); zval_ptr_dtor(&arguments); channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(channelObj); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not create queue."); zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("channel"), channelObj); zend_update_property( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("connection"), PHP_AMQP_READ_OBJ_PROP(amqp_channel_class_entry, channelObj, "connection") ); } /* }}} */ /* {{{ proto AMQPQueue::getName() Get the queue name */ static PHP_METHOD(amqp_queue_class, getName) { zval rv; PHP_AMQP_NOPARAMS() if (PHP_AMQP_READ_THIS_PROP_STRLEN("name") > 0) { PHP_AMQP_RETURN_THIS_PROP("name"); } else { RETURN_NULL(); } } /* }}} */ /* {{{ proto AMQPQueue::setName(string name) Set the queue name */ static PHP_METHOD(amqp_queue_class, setName) { char *name = NULL; size_t name_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) { RETURN_THROWS(); } if (name_len < 1 || name_len > 255) { /* Verify that the name is not null and not an empty string */ zend_throw_exception( amqp_queue_exception_class_entry, "Invalid queue name given, must be between 1 and 255 characters long.", 0 ); return; } /* Set the queue name */ zend_update_property_stringl(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("name"), name, name_len); } /* }}} */ /* {{{ proto AMQPQueue::getFlags() Get the queue parameters */ static PHP_METHOD(amqp_queue_class, getFlags) { zval rv; zend_long flags = 0; PHP_AMQP_NOPARAMS() if (PHP_AMQP_READ_THIS_PROP_BOOL("passive")) { flags |= AMQP_PASSIVE; } if (PHP_AMQP_READ_THIS_PROP_BOOL("durable")) { flags |= AMQP_DURABLE; } if (PHP_AMQP_READ_THIS_PROP_BOOL("exclusive")) { flags |= AMQP_EXCLUSIVE; } if (PHP_AMQP_READ_THIS_PROP_BOOL("autoDelete")) { flags |= AMQP_AUTODELETE; } RETURN_LONG(flags); } /* }}} */ /* {{{ proto AMQPQueue::setFlags(long bitmask) Set the queue parameters */ static PHP_METHOD(amqp_queue_class, setFlags) { zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l!", &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } flags = flags & PHP_AMQP_QUEUE_FLAGS; zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("passive"), IS_PASSIVE(flags)); zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("durable"), IS_DURABLE(flags)); zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("exclusive"), IS_EXCLUSIVE(flags)); zend_update_property_bool(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("autoDelete"), IS_AUTODELETE(flags)); } /* }}} */ /* {{{ proto AMQPQueue::getArgument(string key) Get the queue argument referenced by key */ static PHP_METHOD(amqp_queue_class, getArgument) { zval rv; zval *tmp = NULL; char *key; size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } if ((tmp = zend_hash_str_find(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len)) == NULL) { zend_throw_exception_ex(amqp_queue_exception_class_entry, 0, "The argument \"%s\" does not exist", key); return; } RETURN_ZVAL(tmp, 1, 0); } /* }}} */ /* {{{ proto AMQPQueue::hasArgument(string key) */ static PHP_METHOD(amqp_queue_class, hasArgument) { zval rv; char *key; size_t key_len; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } RETURN_BOOL(zend_hash_str_find(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len) != NULL); } /* }}} */ /* {{{ proto AMQPQueue::getArguments Get the queue arguments */ static PHP_METHOD(amqp_queue_class, getArguments) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("arguments"); } /* }}} */ /* {{{ proto AMQPQueue::setArguments(array args) Overwrite all queue arguments with given args */ static PHP_METHOD(amqp_queue_class, setArguments) { zval *zvalArguments; if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/", &zvalArguments) == FAILURE) { RETURN_THROWS(); } zend_update_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("arguments"), zvalArguments); } /* }}} */ /* {{{ proto AMQPQueue::setArgument(key, value) Get the queue name */ static PHP_METHOD(amqp_queue_class, setArgument) { zval rv; char *key = NULL; size_t key_len = 0; zval *value = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &key, &key_len, &value) == FAILURE) { RETURN_THROWS(); } switch (Z_TYPE_P(value)) { case IS_OBJECT: if (!instanceof_function(Z_OBJCE_P(value), amqp_timestamp_class_entry) && !instanceof_function(Z_OBJCE_P(value), amqp_decimal_class_entry) && !instanceof_function(Z_OBJCE_P(value), amqp_value_class_entry)) { goto err; } // Intentional fall-through case IS_NULL: case IS_TRUE: case IS_FALSE: case IS_LONG: case IS_DOUBLE: case IS_STRING: case IS_ARRAY: zend_hash_str_add(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len, value); Z_TRY_ADDREF_P(value); break; default: err: zend_throw_exception( amqp_queue_exception_class_entry, "The value parameter must be of type bool, int, double, string, null, array, AMQPTimestamp, " "AMQPDecimal, or an implementation of AMQPValue.", 0 ); return; } } /* }}} */ /* {{{ proto AMQPQueue::removeArgument(key) Get the queue name */ static PHP_METHOD(amqp_queue_class, removeArgument) { zval rv; char *key = NULL; size_t key_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &key, &key_len) == FAILURE) { RETURN_THROWS(); } if (zend_hash_str_exists_ind(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len)) { zend_hash_str_del_ind(PHP_AMQP_READ_THIS_PROP_ARR("arguments"), key, key_len); } } /* }}} */ /* {{{ proto int AMQPQueue::declareQueue(); declare queue */ static PHP_METHOD(amqp_queue_class, declareQueue) { zval rv; amqp_channel_resource *channel_resource; char *name; amqp_table_t *arguments; zend_long message_count; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not declare queue."); arguments = php_amqp_type_convert_zval_to_amqp_table(PHP_AMQP_READ_THIS_PROP("arguments")); amqp_queue_declare_ok_t *r = amqp_queue_declare( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), PHP_AMQP_READ_THIS_PROP_BOOL("passive"), PHP_AMQP_READ_THIS_PROP_BOOL("durable"), PHP_AMQP_READ_THIS_PROP_BOOL("exclusive"), PHP_AMQP_READ_THIS_PROP_BOOL("autoDelete"), *arguments ); php_amqp_type_free_amqp_table(arguments); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } message_count = r->message_count; /* Set the queue name, in case it is an autogenerated queue name */ name = php_amqp_type_amqp_bytes_to_char(r->queue); zend_update_property_string(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("name"), name); efree(name); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_LONG(message_count); } /* }}} */ /* {{{ proto int AMQPQueue::bind(string exchangeName, [string routingKey, array arguments]); bind queue to exchange by routing key */ static PHP_METHOD(amqp_queue_class, bind) { zval rv; zval *zvalArguments = NULL; amqp_channel_resource *channel_resource; char *exchange_name; size_t exchange_name_len; char *keyname = NULL; size_t keyname_len = 0; amqp_table_t *arguments = NULL; if (zend_parse_parameters( ZEND_NUM_ARGS(), "s|s!a", &exchange_name, &exchange_name_len, &keyname, &keyname_len, &zvalArguments ) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not bind queue."); if (zvalArguments) { arguments = php_amqp_type_convert_zval_to_amqp_table(zvalArguments); } amqp_queue_bind( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (exchange_name_len > 0 ? amqp_cstring_bytes(exchange_name) : amqp_empty_bytes), (keyname_len > 0 ? amqp_cstring_bytes(keyname) : amqp_empty_bytes), (arguments ? *arguments : amqp_empty_table) ); if (arguments) { php_amqp_type_free_amqp_table(arguments); } amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_queue_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_THROWS(); } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto int AMQPQueue::get([bit flags=AMQP_NOPARAM]); read messages from queue return array (messages) */ static PHP_METHOD(amqp_queue_class, get) { zval rv; amqp_channel_resource *channel_resource; zval message; zend_long flags = INI_INT("amqp.auto_ack") ? AMQP_AUTOACK : AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not get messages from queue."); amqp_rpc_reply_t res = amqp_basic_get( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (AMQP_AUTOACK & flags) ? 1 : 0 ); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_queue_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } if (AMQP_BASIC_GET_EMPTY_METHOD == res.reply.id) { php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_NULL(); } assert(AMQP_BASIC_GET_OK_METHOD == res.reply.id); /* Fill the envelope from response */ amqp_basic_get_ok_t *get_ok_method = res.reply.decoded; amqp_envelope_t envelope; envelope.channel = channel_resource->channel_id; envelope.consumer_tag = amqp_empty_bytes; envelope.delivery_tag = get_ok_method->delivery_tag; envelope.redelivered = get_ok_method->redelivered; envelope.exchange = amqp_bytes_malloc_dup(get_ok_method->exchange); envelope.routing_key = amqp_bytes_malloc_dup(get_ok_method->routing_key); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); res = amqp_read_message( channel_resource->connection_resource->connection_state, channel_resource->channel_id, &envelope.message, 0 ); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_queue_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); amqp_destroy_envelope(&envelope); return; } ZVAL_UNDEF(&message); convert_amqp_envelope_to_zval(&envelope, &message); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); amqp_destroy_envelope(&envelope); RETVAL_ZVAL(&message, 1, 0); zval_ptr_dtor(&message); } /* }}} */ /* {{{ proto array AMQPQueue::consume([callback, flags = , consumer_tag]); consume the message */ static PHP_METHOD(amqp_queue_class, consume) { zval rv; zval current_channel_zv; zval *current_queue_zv = NULL; amqp_channel_resource *channel_resource; amqp_channel_resource *current_channel_resource; zend_fcall_info fci = empty_fcall_info; zend_fcall_info_cache fci_cache = empty_fcall_info_cache; amqp_table_t *arguments; char *consumer_tag = NULL; size_t consumer_tag_len = 0; zend_long flags = INI_INT("amqp.auto_ack") ? AMQP_AUTOACK : AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters( ZEND_NUM_ARGS(), "|f!l!s!", &fci, &fci_cache, &flags, &flags_is_null, &consumer_tag, &consumer_tag_len ) == FAILURE) { RETURN_THROWS(); } zval *channel_zv = PHP_AMQP_READ_THIS_PROP("channel"); zval *consumers = zend_read_property(amqp_channel_class_entry, PHP_AMQP_COMPAT_OBJ_P(channel_zv), ZEND_STRL("consumers"), 0, &rv); if (IS_ARRAY != Z_TYPE_P(consumers)) { zend_throw_exception( amqp_queue_exception_class_entry, "Invalid channel consumers, forgot to call channel constructor?", 0 ); RETURN_THROWS(); } amqp_channel_object *channel = PHP_AMQP_GET_CHANNEL(channel_zv); channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(channel_zv); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not get channel."); if (!(AMQP_JUST_CONSUME & flags)) { /* Set up the consume loop */ arguments = php_amqp_type_convert_zval_to_amqp_table(PHP_AMQP_READ_THIS_PROP("arguments")); amqp_basic_consume_ok_t *r = amqp_basic_consume( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (consumer_tag_len > 0 ? amqp_cstring_bytes(consumer_tag) : amqp_empty_bytes), /* Consumer tag */ (AMQP_NOLOCAL & flags) ? 1 : 0, /* No local */ (AMQP_AUTOACK & flags) ? 1 : 0, /* no_ack, aka AUTOACK */ PHP_AMQP_READ_THIS_PROP_BOOL("exclusive"), *arguments ); php_amqp_type_free_amqp_table(arguments); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); zend_throw_exception(amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code)); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_THROWS(); } char *key; key = estrndup((char *) r->consumer_tag.bytes, (unsigned) r->consumer_tag.len); if (zend_hash_str_find(Z_ARRVAL_P(consumers), key, r->consumer_tag.len) != NULL) { // This should never happen as AMQP server guarantees that consumer tag is unique within channel zend_throw_exception(amqp_exception_class_entry, "Duplicate consumer tag", 0); efree(key); RETURN_THROWS(); } zval tmp; ZVAL_UNDEF(&tmp); ZVAL_COPY(&tmp, getThis()); zend_hash_str_add(Z_ARRVAL_P(consumers), key, r->consumer_tag.len, &tmp); efree(key); /* Set the consumer tag name, in case it is an autogenerated consumer tag name */ zend_update_property_stringl( this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("consumerTag"), (const char *) r->consumer_tag.bytes, (size_t) r->consumer_tag.len ); } if (!ZEND_FCI_INITIALIZED(fci)) { /* Callback not set, we have nothing to do - real consuming may happen later */ return; } struct timeval tv = {0}; struct timeval *tv_ptr = &tv; double read_timeout = PHP_AMQP_READ_OBJ_PROP_DOUBLE( amqp_connection_class_entry, PHP_AMQP_READ_THIS_PROP("connection"), "readTimeout" ); if (read_timeout > 0) { tv.tv_sec = (long int) read_timeout; tv.tv_usec = (long int) ((read_timeout - tv.tv_sec) * 1000000); } else { tv_ptr = NULL; } while (1) { /* Initialize the message */ zval message; amqp_envelope_t envelope; php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); amqp_rpc_reply_t res = amqp_consume_message(channel_resource->connection_resource->connection_state, &envelope, tv_ptr, 0); if (AMQP_RESPONSE_NORMAL != res.reply_type) { if (AMQP_RESPONSE_LIBRARY_EXCEPTION == res.reply_type) { // Special case consumer timeout: do not close connection but end consumption if (AMQP_STATUS_TIMEOUT == res.library_error) { zend_throw_exception(amqp_queue_exception_class_entry, "Consumer timeout exceed", 0); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } // Handle a potentially recoverable error if (AMQP_STATUS_UNEXPECTED_STATE == res.library_error && PHP_AMQP_RESOURCE_RESPONSE_OK <= php_amqp_connection_resource_error_advanced(res, &PHP_AMQP_G(error_message), channel)) { continue; } } /* Mark connection resource as closed to prevent sending any further requests */ channel_resource->connection_resource->is_connected = '\0'; php_amqp_disconnect_force(channel_resource->connection_resource); php_amqp_zend_throw_exception_short(res, amqp_queue_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_THROWS(); } ZVAL_UNDEF(&message); convert_amqp_envelope_to_zval(&envelope, &message); current_channel_resource = channel_resource->connection_resource->slots[envelope.channel - 1]; if (!current_channel_resource) { // This should never happen, but just in case php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, "Orphaned channel. Please, report a bug.", 0 ); amqp_destroy_envelope(&envelope); break; } ZVAL_UNDEF(¤t_channel_zv); ZVAL_OBJ(¤t_channel_zv, ¤t_channel_resource->parent->zo); consumers = zend_read_property( amqp_channel_class_entry, PHP_AMQP_COMPAT_OBJ_P(¤t_channel_zv), ZEND_STRL("consumers"), 0, &rv ); if (IS_ARRAY != Z_TYPE_P(consumers)) { zend_throw_exception( amqp_queue_exception_class_entry, "Invalid channel consumers, forgot to call channel constructor?", 0 ); amqp_destroy_envelope(&envelope); break; } char *key; key = estrndup((char *) envelope.consumer_tag.bytes, (unsigned) envelope.consumer_tag.len); if ((current_queue_zv = zend_hash_str_find(Z_ARRVAL_P(consumers), key, envelope.consumer_tag.len)) == NULL) { zval exception; ZVAL_UNDEF(&exception); object_init_ex(&exception, amqp_envelope_exception_class_entry); zend_update_property_string( zend_exception_get_default(), PHP_AMQP_COMPAT_OBJ_P(&exception), ZEND_STRL("message"), "Orphaned envelope" ); zend_update_property( amqp_envelope_exception_class_entry, PHP_AMQP_COMPAT_OBJ_P(&exception), ZEND_STRL("envelope"), &message ); zend_throw_exception_object(&exception); zval_ptr_dtor(&message); amqp_destroy_envelope(&envelope); efree(key); break; } efree(key); amqp_destroy_envelope(&envelope); /* Make the callback */ zval params; zval retval; /* Build the parameter array */ ZVAL_UNDEF(¶ms); array_init(¶ms); /* Dump it into the params array */ add_index_zval(¶ms, 0, &message); Z_ADDREF_P(&message); /* Add a pointer to the queue: */ add_index_zval(¶ms, 1, current_queue_zv); Z_ADDREF_P(current_queue_zv); /* Convert everything to be callable */ zend_fcall_info_args(&fci, ¶ms); /* Initialize the return value pointer */ fci.retval = &retval; zend_call_function(&fci, &fci_cache); /* Clean up our mess */ zend_fcall_info_args_clear(&fci, 1); zval_ptr_dtor(¶ms); zval_ptr_dtor(&message); /* Check if user land function wants to bail */ if (EG(exception) || Z_TYPE_P(&retval) == IS_FALSE) { break; } } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto int AMQPQueue::ack(long deliveryTag, [bit flags=AMQP_NOPARAM]); acknowledge the message */ static PHP_METHOD(amqp_queue_class, ack) { zval rv; amqp_channel_resource *channel_resource; zend_long deliveryTag = 0; zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!", &deliveryTag, &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not ack message."); /* NOTE: basic.ack is asynchronous and thus will not indicate failure if something goes wrong on the broker */ int status = amqp_basic_ack( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (uint64_t) deliveryTag, (AMQP_MULTIPLE & flags) ? 1 : 0 ); if (status != AMQP_STATUS_OK) { /* Emulate library error */ amqp_rpc_reply_t res; res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } } /* }}} */ /* {{{ proto int AMQPQueue::nack(long deliveryTag, [bit flags=AMQP_NOPARAM]); acknowledge the message */ static PHP_METHOD(amqp_queue_class, nack) { zval rv; amqp_channel_resource *channel_resource; zend_long deliveryTag = 0; zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!", &deliveryTag, &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not nack message."); /* NOTE: basic.nack is asynchronous and thus will not indicate failure if something goes wrong on the broker */ int status = amqp_basic_nack( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (uint64_t) deliveryTag, (AMQP_MULTIPLE & flags) ? 1 : 0, (AMQP_REQUEUE & flags) ? 1 : 0 ); if (status != AMQP_STATUS_OK) { /* Emulate library error */ amqp_rpc_reply_t res; res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } } /* }}} */ /* {{{ proto int AMQPQueue::reject(long deliveryTag, [bit flags=AMQP_NOPARAM]); acknowledge the message */ static PHP_METHOD(amqp_queue_class, reject) { zval rv; amqp_channel_resource *channel_resource; zend_long deliveryTag = 0; zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|l!", &deliveryTag, &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not reject message."); /* NOTE: basic.reject is asynchronous and thus will not indicate failure if something goes wrong on the broker */ int status = amqp_basic_reject( channel_resource->connection_resource->connection_state, channel_resource->channel_id, (uint64_t) deliveryTag, (AMQP_REQUEUE & flags) ? 1 : 0 ); if (status != AMQP_STATUS_OK) { /* Emulate library error */ amqp_rpc_reply_t res; res.reply_type = AMQP_RESPONSE_LIBRARY_EXCEPTION; res.library_error = status; php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } } /* }}} */ /* {{{ proto int AMQPQueue::purge(); purge queue */ static PHP_METHOD(amqp_queue_class, purge) { zval rv; amqp_channel_resource *channel_resource; PHP_AMQP_NOPARAMS() channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not purge queue."); amqp_queue_purge_ok_t *r = amqp_queue_purge( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : "") ); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_LONG(r->message_count); } /* }}} */ /* {{{ proto int AMQPQueue::cancel([string consumerTag]); cancel queue to consumer */ static PHP_METHOD(amqp_queue_class, cancel) { zval rv; amqp_channel_resource *channel_resource; char *consumer_tag = NULL; size_t consumer_tag_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s", &consumer_tag, &consumer_tag_len) == FAILURE) { RETURN_THROWS(); } zval *channel_zv = PHP_AMQP_READ_THIS_PROP("channel"); zval *consumers = zend_read_property(amqp_channel_class_entry, PHP_AMQP_COMPAT_OBJ_P(channel_zv), ZEND_STRL("consumers"), 0, &rv); bool previous_consumer_tag_exists = (bool) (IS_STRING == Z_TYPE_P(PHP_AMQP_READ_THIS_PROP("consumerTag"))); if (IS_ARRAY != Z_TYPE_P(consumers)) { zend_throw_exception( amqp_queue_exception_class_entry, "Invalid channel consumers, forgot to call channel constructor?", 0 ); RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(channel_zv); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not cancel queue."); if (!consumer_tag_len && (!previous_consumer_tag_exists || !PHP_AMQP_READ_THIS_PROP_STRLEN("consumerTag"))) { return; } amqp_basic_cancel_ok_t *r = amqp_basic_cancel( channel_resource->connection_resource->connection_state, channel_resource->channel_id, consumer_tag_len > 0 ? amqp_cstring_bytes(consumer_tag) : amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STR("consumerTag")) ); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } if (!consumer_tag_len || (previous_consumer_tag_exists && strcmp(consumer_tag, PHP_AMQP_READ_THIS_PROP_STR("consumerTag")) == 0)) { zend_update_property_null(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("consumerTag")); } zend_hash_str_del_ind(Z_ARRVAL_P(consumers), r->consumer_tag.bytes, r->consumer_tag.len); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto int AMQPQueue::recover([boolean requeue]); recover messages already delivered to the consumer */ static PHP_METHOD(amqp_queue_class, recover) { zval rv; amqp_channel_resource *channel_resource; bool requeue = 1; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|b", &requeue) == FAILURE) { RETURN_THROWS(); } zval *channel_zv = PHP_AMQP_READ_THIS_PROP("channel"); channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(channel_zv); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not recover messages."); amqp_basic_recover_ok_t *r = amqp_basic_recover( channel_resource->connection_resource->connection_state, channel_resource->channel_id, requeue ); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto int AMQPQueue::unbind(string exchangeName, [string routingKey, array arguments]); unbind queue from exchange */ static PHP_METHOD(amqp_queue_class, unbind) { zval rv; zval *zvalArguments = NULL; amqp_channel_resource *channel_resource; char *exchange_name; size_t exchange_name_len; char *keyname = NULL; size_t keyname_len = 0; amqp_table_t *arguments = NULL; if (zend_parse_parameters( ZEND_NUM_ARGS(), "s|s!a", &exchange_name, &exchange_name_len, &keyname, &keyname_len, &zvalArguments ) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not unbind queue."); if (zvalArguments) { arguments = php_amqp_type_convert_zval_to_amqp_table(zvalArguments); } amqp_queue_unbind( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (exchange_name_len > 0 ? amqp_cstring_bytes(exchange_name) : amqp_empty_bytes), (keyname_len > 0 ? amqp_cstring_bytes(keyname) : amqp_empty_bytes), (arguments ? *arguments : amqp_empty_table) ); if (arguments) { php_amqp_type_free_amqp_table(arguments); } amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); if (PHP_AMQP_MAYBE_ERROR(res, channel_resource)) { php_amqp_zend_throw_exception_short(res, amqp_queue_exception_class_entry); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); } /* }}} */ /* {{{ proto int AMQPQueue::delete([long flags = AMQP_NOPARAM]]); delete queue and return the number of messages deleted in it */ static PHP_METHOD(amqp_queue_class, delete) { zval rv; amqp_channel_resource *channel_resource; zend_long flags = AMQP_NOPARAM; bool flags_is_null = 1; zend_long message_count; if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l!", &flags, &flags_is_null) == FAILURE) { RETURN_THROWS(); } channel_resource = PHP_AMQP_GET_CHANNEL_RESOURCE(PHP_AMQP_READ_THIS_PROP("channel")); PHP_AMQP_VERIFY_CHANNEL_RESOURCE(channel_resource, "Could not delete queue."); amqp_queue_delete_ok_t *r = amqp_queue_delete( channel_resource->connection_resource->connection_state, channel_resource->channel_id, amqp_cstring_bytes(PHP_AMQP_READ_THIS_PROP_STRLEN("name") ? PHP_AMQP_READ_THIS_PROP_STR("name") : ""), (AMQP_IFUNUSED & flags) ? 1 : 0, (AMQP_IFEMPTY & flags) ? 1 : 0 ); if (!r) { amqp_rpc_reply_t res = amqp_get_rpc_reply(channel_resource->connection_resource->connection_state); php_amqp_error(res, &PHP_AMQP_G(error_message), channel_resource->connection_resource, channel_resource); php_amqp_zend_throw_exception( res, amqp_queue_exception_class_entry, PHP_AMQP_G(error_message), PHP_AMQP_G(error_code) ); php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); return; } message_count = r->message_count; php_amqp_maybe_release_buffers_on_channel(channel_resource->connection_resource, channel_resource); RETURN_LONG(message_count); } /* }}} */ /* {{{ proto AMQPChannel::getChannel() Get the AMQPChannel object in use */ static PHP_METHOD(amqp_queue_class, getChannel) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("channel"); } /* }}} */ /* {{{ proto AMQPChannel::getConnection() Get the AMQPConnection object in use */ static PHP_METHOD(amqp_queue_class, getConnection) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("connection"); } /* }}} */ /* {{{ proto string AMQPChannel::getConsumerTag() Get latest consumer tag*/ static PHP_METHOD(amqp_queue_class, getConsumerTag) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("consumerTag"); } /* }}} */ /* amqp_queue_class ARG_INFO definition */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_queue_class__construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_OBJ_INFO(0, channel, AMQPChannel, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_getName, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_setName, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_getFlags, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_setFlags, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, flags, IS_LONG, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_queue_class_getArgument, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_getArguments, ZEND_SEND_BY_VAL, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_setArgument, ZEND_SEND_BY_VAL, 2, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_ARG_INFO(0, argumentValue) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_removeArgument, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_hasArgument, ZEND_SEND_BY_VAL, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, argumentName, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_setArguments, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_ARRAY_INFO(0, arguments, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_declareQueue, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_bind, ZEND_RETURN_VALUE, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, exchangeName, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, routingKey, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arguments, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_amqp_queue_class_get, ZEND_SEND_BY_VAL, 0, AMQPEnvelope, 1) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_consume, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, callback, IS_CALLABLE, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, consumerTag, IS_STRING, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_ack, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, deliveryTag, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_nack, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, deliveryTag, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_reject, ZEND_SEND_BY_VAL, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, deliveryTag, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_recover, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, requeue, _IS_BOOL, 0, "true") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_purge, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_cancel, ZEND_SEND_BY_VAL, 0, IS_VOID, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, consumerTag, IS_STRING, 0, "\"\"") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_unbind, ZEND_RETURN_VALUE, 1, IS_VOID, 0) ZEND_ARG_TYPE_INFO(0, exchangeName, IS_STRING, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, routingKey, IS_STRING, 1, "null") ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, arguments, IS_ARRAY, 0, "[]") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_delete, ZEND_SEND_BY_VAL, 0, IS_LONG, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 1, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO(arginfo_amqp_queue_class_getChannel, AMQPChannel, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO(arginfo_amqp_queue_class_getConnection, AMQPConnection, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_queue_class_getConsumerTag, ZEND_SEND_BY_VAL, 0, IS_STRING, 1) ZEND_END_ARG_INFO() zend_function_entry amqp_queue_class_functions[] = { PHP_ME(amqp_queue_class, __construct, arginfo_amqp_queue_class__construct, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getName, arginfo_amqp_queue_class_getName, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, setName, arginfo_amqp_queue_class_setName, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getFlags, arginfo_amqp_queue_class_getFlags, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, setFlags, arginfo_amqp_queue_class_setFlags, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getArgument, arginfo_amqp_queue_class_getArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getArguments, arginfo_amqp_queue_class_getArguments, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, setArgument, arginfo_amqp_queue_class_setArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, removeArgument, arginfo_amqp_queue_class_removeArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, setArguments, arginfo_amqp_queue_class_setArguments, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, hasArgument, arginfo_amqp_queue_class_hasArgument, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, declareQueue, arginfo_amqp_queue_class_declareQueue, ZEND_ACC_PUBLIC) PHP_MALIAS(amqp_queue_class, declare, declareQueue, arginfo_amqp_queue_class_declareQueue, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, bind, arginfo_amqp_queue_class_bind, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, get, arginfo_amqp_queue_class_get, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, consume, arginfo_amqp_queue_class_consume, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, ack, arginfo_amqp_queue_class_ack, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, nack, arginfo_amqp_queue_class_nack, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, reject, arginfo_amqp_queue_class_reject, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, recover, arginfo_amqp_queue_class_recover, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, purge, arginfo_amqp_queue_class_purge, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, cancel, arginfo_amqp_queue_class_cancel, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, delete, arginfo_amqp_queue_class_delete, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, unbind, arginfo_amqp_queue_class_unbind, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getChannel, arginfo_amqp_queue_class_getChannel, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getConnection, arginfo_amqp_queue_class_getConnection, ZEND_ACC_PUBLIC) PHP_ME(amqp_queue_class, getConsumerTag, arginfo_amqp_queue_class_getConsumerTag, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_queue) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPQueue", amqp_queue_class_functions); this_ce = zend_register_internal_class(&ce); PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ(this_ce, "connection", ZEND_ACC_PRIVATE, AMQPConnection, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ(this_ce, "channel", ZEND_ACC_PRIVATE, AMQPChannel, 0); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "name", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "consumerTag", ZEND_ACC_PRIVATE, IS_STRING, 1); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "passive", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "durable", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "exclusive", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_FALSE); /* By default, the auto_delete flag should be set */ PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "autoDelete", ZEND_ACC_PRIVATE, _IS_BOOL, 0, ZVAL_TRUE); #if PHP_VERSION_ID >= 80000 PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "arguments", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_EMPTY_ARRAY); #else PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(this_ce, "arguments", ZEND_ACC_PRIVATE, IS_ARRAY, 0, ZVAL_NULL); #endif return SUCCESS; } amqp-2.1.2/amqp_queue.h0000644000076500000240000000310614553444052014542 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_queue_class_entry; PHP_MINIT_FUNCTION(amqp_queue); amqp-2.1.2/amqp_timestamp.c0000644000076500000240000001234414553444052015420 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "zend_exceptions.h" #include "php_amqp.h" #include "ext/standard/php_math.h" #include "amqp_value.h" zend_class_entry *amqp_timestamp_class_entry; #define this_ce amqp_timestamp_class_entry static const double AMQP_TIMESTAMP_MAX = 0xFFFFFFFFFFFFFFFFp0; static const double AMQP_TIMESTAMP_MIN = 0; /* {{{ proto AMQPTimestamp::__construct(float $timestamp) */ static PHP_METHOD(amqp_timestamp_class, __construct) { double timestamp; if (zend_parse_parameters(ZEND_NUM_ARGS(), "d", ×tamp) == FAILURE) { RETURN_THROWS(); } if (timestamp < AMQP_TIMESTAMP_MIN) { zend_throw_exception_ex( amqp_value_exception_class_entry, 0, "The timestamp parameter must be greater than %0.f.", AMQP_TIMESTAMP_MIN ); return; } if (timestamp > AMQP_TIMESTAMP_MAX) { zend_throw_exception_ex( amqp_value_exception_class_entry, 0, "The timestamp parameter must be less than %0.f.", AMQP_TIMESTAMP_MAX ); return; } zend_update_property_double(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("timestamp"), floor(timestamp)); } /* }}} */ /* {{{ proto float AMQPTimestamp::getTimestamp() Get timestamp */ static PHP_METHOD(amqp_timestamp_class, getTimestamp) { zval rv; PHP_AMQP_NOPARAMS() PHP_AMQP_RETURN_THIS_PROP("timestamp"); } /* }}} */ /* {{{ proto string AMQPTimestamp::__toString() Return timestamp as string */ static PHP_METHOD(amqp_timestamp_class, __toString) { zval rv; PHP_AMQP_NOPARAMS() zval *timestamp = zend_read_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL("timestamp"), 0, &rv); RETURN_NEW_STR(_php_math_number_format_ex(Z_DVAL_P(timestamp), 0, "", 0, "", 0)); } /* }}} */ /* {{{ proto string AMQPTimestamp::toAmqpValue() Return timestamp as AMQPValue */ static PHP_METHOD(amqp_timestamp_class, toAmqpValue) { PHP_AMQP_NOPARAMS() RETURN_ZVAL(getThis(), 1, 0); } /* }}} */ ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_timestamp_class_construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1) ZEND_ARG_TYPE_INFO(0, timestamp, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_timestamp_class_getTimestamp, ZEND_SEND_BY_VAL, 0, IS_DOUBLE, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_amqp_timestamp_class_toString, ZEND_SEND_BY_VAL, 0, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_timestamp_class_toAmqpValue, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) ZEND_END_ARG_INFO() zend_function_entry amqp_timestamp_class_functions[] = { PHP_ME(amqp_timestamp_class, __construct, arginfo_amqp_timestamp_class_construct, ZEND_ACC_PUBLIC) PHP_ME(amqp_timestamp_class, getTimestamp, arginfo_amqp_timestamp_class_getTimestamp, ZEND_ACC_PUBLIC) PHP_ME(amqp_timestamp_class, __toString, arginfo_amqp_timestamp_class_toString, ZEND_ACC_PUBLIC) PHP_ME(amqp_timestamp_class, toAmqpValue, arginfo_amqp_timestamp_class_toAmqpValue, ZEND_ACC_PUBLIC) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_timestamp) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPTimestamp", amqp_timestamp_class_functions); this_ce = zend_register_internal_class(&ce); zend_class_implements(this_ce, 1, amqp_value_class_entry); this_ce->ce_flags |= ZEND_ACC_FINAL; #if PHP_VERSION_ID >= 80200 this_ce->ce_flags |= ZEND_ACC_READONLY_CLASS; #endif PHP_AMQP_DECLARE_TYPED_PROPERTY(this_ce, "timestamp", ZEND_ACC_PRIVATE, IS_DOUBLE, 0); zend_declare_class_constant_double(this_ce, ZEND_STRL("MAX"), AMQP_TIMESTAMP_MAX); zend_declare_class_constant_double(this_ce, ZEND_STRL("MIN"), AMQP_TIMESTAMP_MIN); return SUCCESS; } amqp-2.1.2/amqp_timestamp.h0000644000076500000240000000311614553444052015422 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_timestamp_class_entry; PHP_MINIT_FUNCTION(amqp_timestamp); amqp-2.1.2/amqp_type.c0000644000076500000240000003231214553444052014373 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #else #include #endif #include "Zend/zend_interfaces.h" #include "Zend/zend_exceptions.h" #include "amqp_value.h" #include "amqp_decimal.h" #include "amqp_timestamp.h" #include "amqp_type.h" #ifdef PHP_WIN32 #define strtoimax _strtoi64 #endif static void php_amqp_type_free_amqp_array_internal(amqp_array_t *array); static void php_amqp_type_free_amqp_table_internal(amqp_table_t *object, bool clear_root); void php_amqp_type_zval_to_amqp_array_internal(zval *value, amqp_array_t *arguments, zend_ulong depth); void php_amqp_type_zval_to_amqp_container_internal(zval *array, amqp_field_value_t **field_ptr, zend_ulong depth); void php_amqp_type_zval_to_amqp_table_internal(zval *array, amqp_table_t *amqp_table, zend_ulong depth); bool php_amqp_type_zval_to_amqp_value_internal( zval *value, amqp_field_value_t **field_ptr, char *key, zend_ulong depth ); amqp_bytes_t php_amqp_type_char_to_amqp_long(char const *cstr, size_t len) { amqp_bytes_t result; if (len < 1) { return amqp_empty_bytes; } result.len = (size_t) len; result.bytes = (void *) cstr; return result; } char *php_amqp_type_amqp_bytes_to_char(amqp_bytes_t bytes) { /* We will need up to 4 chars per byte, plus the terminating 0 */ char *res = emalloc(bytes.len * 4 + 1); uint8_t *data = bytes.bytes; char *p = res; size_t i; for (i = 0; i < bytes.len; i++) { if (data[i] >= 32 && data[i] != 127) { *p++ = data[i]; } else { *p++ = '\\'; *p++ = '0' + (data[i] >> 6); *p++ = '0' + (data[i] >> 3 & 0x7); *p++ = '0' + (data[i] & 0x7); } } *p = 0; return res; } void php_amqp_type_zval_to_amqp_container_internal(zval *array, amqp_field_value_t **field_ptr, zend_ulong depth) { HashTable *ht; zend_string *key; amqp_field_value_t *field; ht = Z_ARRVAL_P(array); bool is_amqp_array = 1; ZEND_HASH_FOREACH_STR_KEY(ht, key) if (key) { is_amqp_array = 0; break; } ZEND_HASH_FOREACH_END (); field = *field_ptr; if (is_amqp_array) { field->kind = AMQP_FIELD_KIND_ARRAY; php_amqp_type_zval_to_amqp_array_internal(array, &field->value.array, depth); } else { field->kind = AMQP_FIELD_KIND_TABLE; php_amqp_type_zval_to_amqp_table_internal(array, &field->value.table, depth); } } void php_amqp_type_zval_to_amqp_table_internal(zval *array, amqp_table_t *amqp_table, zend_ulong depth) { HashTable *ht; zval *value_nested; zend_string *zkey; zend_ulong index; char *key; unsigned key_len; ht = Z_ARRVAL_P(array); amqp_table->entries = (amqp_table_entry_t *) ecalloc((size_t) zend_hash_num_elements(ht), sizeof(amqp_table_entry_t)); amqp_table->num_entries = 0; ZEND_HASH_FOREACH_KEY_VAL(ht, index, zkey, value_nested) char *string_key; amqp_table_entry_t *table_entry; amqp_field_value_t *field; /* Now pull the key */ if (!zkey) { if (depth > 0) { /* Convert to strings non-string keys */ char str[32]; key_len = snprintf(str, 32, "%lu", index); key = str; } else { /* Skip things that are not strings */ php_error_docref(NULL, E_WARNING, "Ignoring non-string header field '%lu'", index); continue; } } else { key_len = ZSTR_LEN(zkey); key = ZSTR_VAL(zkey); } string_key = estrndup(key, key_len); /* Build the array */ table_entry = &amqp_table->entries[amqp_table->num_entries++]; field = &table_entry->value; if (!php_amqp_type_zval_to_amqp_value_internal(value_nested, &field, key, depth + 1)) { /* Reset entries counter back */ amqp_table->num_entries--; efree(string_key); continue; } table_entry->key = amqp_cstring_bytes(string_key); ZEND_HASH_FOREACH_END(); } void php_amqp_type_zval_to_amqp_array_internal(zval *value, amqp_array_t *arguments, zend_ulong depth) { HashTable *ht; zval *value_nested; zend_string *zkey; ht = Z_ARRVAL_P(value); /* Allocate all the memory necessary for storing the arguments */ arguments->entries = (amqp_field_value_t *) ecalloc((size_t) zend_hash_num_elements(ht), sizeof(amqp_field_value_t)); arguments->num_entries = 0; ZEND_HASH_FOREACH_STR_KEY_VAL(ht, zkey, value_nested) amqp_field_value_t *field = &arguments->entries[arguments->num_entries++]; if (!php_amqp_type_zval_to_amqp_value_internal(value_nested, &field, ZSTR_VAL(zkey), depth)) { /* Reset entries counter back */ arguments->num_entries--; continue; } ZEND_HASH_FOREACH_END (); } bool php_amqp_type_zval_to_amqp_value_internal(zval *value, amqp_field_value_t **field_ptr, char *key, zend_ulong depth) { bool result; char type[16]; amqp_field_value_t *field; if (depth > PHP_AMQP_G(serialization_depth)) { zend_throw_exception_ex( amqp_exception_class_entry, 0, "Maximum serialization depth of %ld reached while serializing value", PHP_AMQP_G(serialization_depth) ); return 0; } result = 1; field = *field_ptr; switch (Z_TYPE_P(value)) { case IS_TRUE: case IS_FALSE: field->kind = AMQP_FIELD_KIND_BOOLEAN; field->value.boolean = (amqp_boolean_t) Z_TYPE_P(value) != IS_FALSE; break; case IS_DOUBLE: field->kind = AMQP_FIELD_KIND_F64; field->value.f64 = Z_DVAL_P(value); break; case IS_LONG: field->kind = AMQP_FIELD_KIND_I64; field->value.i64 = Z_LVAL_P(value); break; case IS_STRING: field->kind = AMQP_FIELD_KIND_UTF8; if (Z_STRLEN_P(value)) { amqp_bytes_t bytes; bytes.len = (size_t) Z_STRLEN_P(value); bytes.bytes = estrndup(Z_STRVAL_P(value), (unsigned) Z_STRLEN_P(value)); field->value.bytes = bytes; } else { field->value.bytes = amqp_empty_bytes; } break; case IS_ARRAY: php_amqp_type_zval_to_amqp_container_internal(value, &field, depth + 1); break; case IS_NULL: field->kind = AMQP_FIELD_KIND_VOID; break; case IS_OBJECT: if (instanceof_function(Z_OBJCE_P(value), amqp_timestamp_class_entry)) { zval result_zv; zend_call_method_with_0_params( PHP_AMQP_COMPAT_OBJ_P(value), amqp_timestamp_class_entry, NULL, "gettimestamp", &result_zv ); field->kind = AMQP_FIELD_KIND_TIMESTAMP; field->value.u64 = Z_DVAL(result_zv); zval_ptr_dtor(&result_zv); break; } else if (instanceof_function(Z_OBJCE_P(value), amqp_decimal_class_entry)) { field->kind = AMQP_FIELD_KIND_DECIMAL; zval result_zv; zend_call_method_with_0_params( PHP_AMQP_COMPAT_OBJ_P(value), amqp_decimal_class_entry, NULL, "getexponent", &result_zv ); field->value.decimal.decimals = (uint8_t) Z_LVAL(result_zv); zval_ptr_dtor(&result_zv); zend_call_method_with_0_params( PHP_AMQP_COMPAT_OBJ_P(value), amqp_decimal_class_entry, NULL, "getsignificand", &result_zv ); field->value.decimal.value = (uint32_t) Z_LVAL(result_zv); zval_ptr_dtor(&result_zv); break; } else if (instanceof_function(Z_OBJCE_P(value), amqp_value_class_entry)) { zval result_zv; zend_call_method_with_0_params( PHP_AMQP_COMPAT_OBJ_P(value), Z_OBJCE_P(value), NULL, "toamqpvalue", &result_zv ); bool recursion_res = php_amqp_type_zval_to_amqp_value_internal(&result_zv, field_ptr, key, depth + 1); zval_ptr_dtor(&result_zv); return recursion_res; } default: switch (Z_TYPE_P(value)) { case IS_OBJECT: strcpy(type, "object"); break; case IS_RESOURCE: strcpy(type, "resource"); break; default: strcpy(type, "unknown"); break; } php_error_docref(NULL, E_WARNING, "Ignoring field '%s' due to unsupported value type (%s)", key, type); result = 0; break; } return result; } amqp_table_t *php_amqp_type_convert_zval_to_amqp_table(zval *php_array) { amqp_table_t *amqp_table; /* In setArguments, we are overwriting all the existing values */ amqp_table = (amqp_table_t *) emalloc(sizeof(amqp_table_t)); php_amqp_type_zval_to_amqp_table_internal(php_array, amqp_table, 0); return amqp_table; } static void php_amqp_type_free_amqp_array_internal(amqp_array_t *array) { if (!array) { return; } int macroEntryCounter; for (macroEntryCounter = 0; macroEntryCounter < array->num_entries; macroEntryCounter++) { amqp_field_value_t *entry = &array->entries[macroEntryCounter]; switch (entry->kind) { case AMQP_FIELD_KIND_TABLE: php_amqp_type_free_amqp_table_internal(&entry->value.table, 0); break; case AMQP_FIELD_KIND_ARRAY: php_amqp_type_free_amqp_array_internal(&entry->value.array); break; case AMQP_FIELD_KIND_UTF8: if (entry->value.bytes.bytes) { efree(entry->value.bytes.bytes); } break; // default: break; } } if (array->entries) { efree(array->entries); } } static void php_amqp_type_free_amqp_table_internal(amqp_table_t *object, bool clear_root) { if (!object) { return; } if (object->entries) { int macroEntryCounter; for (macroEntryCounter = 0; macroEntryCounter < object->num_entries; macroEntryCounter++) { amqp_table_entry_t *entry = &object->entries[macroEntryCounter]; efree(entry->key.bytes); switch (entry->value.kind) { case AMQP_FIELD_KIND_TABLE: php_amqp_type_free_amqp_table_internal(&entry->value.value.table, 0); break; case AMQP_FIELD_KIND_ARRAY: php_amqp_type_free_amqp_array_internal(&entry->value.value.array); break; case AMQP_FIELD_KIND_UTF8: if (entry->value.value.bytes.bytes) { efree(entry->value.value.bytes.bytes); } break; default: break; } } efree(object->entries); } if (clear_root) { efree(object); } } void php_amqp_type_free_amqp_table(amqp_table_t *object) { php_amqp_type_free_amqp_table_internal(object, 1); } amqp-2.1.2/amqp_type.h0000644000076500000240000000372014553444052014401 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #else #include #endif #include "php_amqp.h" PHP_MINIT_FUNCTION(amqp_type); char *php_amqp_type_amqp_bytes_to_char(amqp_bytes_t bytes); amqp_bytes_t php_amqp_type_char_to_amqp_long(char const *cstr, size_t len); amqp_table_t *php_amqp_type_convert_zval_to_amqp_table(zval *php_array); void php_amqp_type_free_amqp_table(amqp_table_t *object); amqp-2.1.2/amqp_value.c0000644000076500000240000000417014553444052014527 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" zend_class_entry *amqp_value_class_entry; #define this_ce amqp_value_class_entry ZEND_BEGIN_ARG_INFO_EX(arginfo_amqp_value_class_toAmqpValue, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 0) ZEND_END_ARG_INFO() zend_function_entry amqp_value_class_functions[] = { PHP_ABSTRACT_ME(amqp_value_class, toAmqpValue, arginfo_amqp_value_class_toAmqpValue) {NULL, NULL, NULL} }; PHP_MINIT_FUNCTION(amqp_value) { zend_class_entry ce; INIT_CLASS_ENTRY(ce, "AMQPValue", amqp_value_class_functions); amqp_value_class_entry = zend_register_internal_interface(&ce); return SUCCESS; } amqp-2.1.2/amqp_value.h0000644000076500000240000000310614553444052014532 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #include "php.h" extern zend_class_entry *amqp_value_class_entry; PHP_MINIT_FUNCTION(amqp_value); amqp-2.1.2/php_amqp.h0000644000076500000240000006225014553444052014212 0ustar lstrojnystaff/* +----------------------------------------------------------------------+ | PHP Version 5 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 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: Alexandre Kalendarev akalend@mail.ru Copyright (c) 2009-2010 | | Lead: | | - Pieter de Zwart | | Maintainers: | | - Brad Rodriguez | | - Jonathan Tansavatdi | +----------------------------------------------------------------------+ */ #ifndef PHP_AMQP_H #define PHP_AMQP_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* True global resources - no need for thread safety here */ extern zend_class_entry *amqp_exception_class_entry, *amqp_connection_exception_class_entry, *amqp_channel_exception_class_entry, *amqp_exchange_exception_class_entry, *amqp_queue_exception_class_entry, *amqp_value_exception_class_entry; typedef struct _amqp_connection_resource amqp_connection_resource; typedef struct _amqp_connection_object amqp_connection_object; typedef struct _amqp_channel_object amqp_channel_object; typedef struct _amqp_channel_resource amqp_channel_resource; typedef struct _amqp_channel_callbacks amqp_channel_callbacks; typedef struct _amqp_callback_bucket amqp_callback_bucket; #if HAVE_LIBRABBITMQ_NEW_LAYOUT #include #else #include #endif extern zend_module_entry amqp_module_entry; #define phpext_amqp_ptr &amqp_module_entry #ifdef PHP_WIN32 #define PHP_AMQP_API __declspec(dllexport) #else #define PHP_AMQP_API #endif #ifdef ZTS #include "TSRM.h" #endif #include "php_amqp_version.h" #if PHP_VERSION_ID >= 80000 #define PHP_AMQP_COMPAT_OBJ_P(zv) Z_OBJ_P(zv) #define PHP_AMQP_DECLARE_PROPERTY_TYPE(type, nullable) (zend_type) ZEND_TYPE_INIT_CODE(type, nullable, 0) #define PHP_AMQP_DECLARE_PROPERTY_OBJ_TYPE(class_name, nullable) \ (zend_type) ZEND_TYPE_INIT_CLASS(class_name, nullable, 0) #else #define PHP_AMQP_COMPAT_OBJ_P(zv) (zv) #define ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(pass_by_ref, name, type_hint, allow_null, default_value) \ ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) #define PHP_AMQP_DECLARE_PROPERTY_TYPE(type, nullable) ZEND_TYPE_ENCODE(type, nullable) #define PHP_AMQP_DECLARE_PROPERTY_OBJ_TYPE(class_name, nullable) ZEND_TYPE_ENCODE_CLASS(class_name, nullable) #define RETURN_THROWS() \ do { \ ZEND_ASSERT(EG(exception)); \ (void) return_value; \ return; \ } while (0) #endif #if PHP_VERSION_ID < 80200 #define zend_ini_parse_quantity_warn(v, name) (zend_atol(ZSTR_VAL(v), ZSTR_LEN(v))) #endif #define PHP_AMQP_NULLABLE_DEFAULT_INIT(val, nullable) \ zval val; \ if (nullable) { \ ZVAL_NULL(&val); \ } else { \ ZVAL_UNDEF(&val); \ } #define PHP_AMQP_DECLARE_TYPED_PROPERTY_ZVAL(class_entry, name, flags, type_info, val) \ { \ zend_string *__name = zend_string_init(ZEND_STRL(name), 1); \ zend_declare_typed_property(class_entry, __name, &(val), flags, NULL, type_info); \ zend_string_release(__name); \ } #define PHP_AMQP_DECLARE_TYPED_PROPERTY(class_entry, name, flags, type, nullable) \ { \ PHP_AMQP_NULLABLE_DEFAULT_INIT(__val, nullable); \ PHP_AMQP_DECLARE_TYPED_PROPERTY_ZVAL( \ class_entry, \ name, \ flags, \ PHP_AMQP_DECLARE_PROPERTY_TYPE(type, nullable), \ __val \ ) \ } #define PHP_AMQP_DECLARE_TYPED_PROPERTY_WITH_DEFAULT(class_entry, name, flags, type, nullable, init) \ { \ zval __val; \ ZVAL_UNDEF(&__val); \ init(&__val); \ PHP_AMQP_DECLARE_TYPED_PROPERTY_ZVAL( \ class_entry, \ name, \ flags, \ PHP_AMQP_DECLARE_PROPERTY_TYPE(type, nullable), \ __val \ ) \ } #define PHP_AMQP_DECLARE_TYPED_PROPERTY_OBJ(class_entry, name, flags, class_name, nullable) \ { \ PHP_AMQP_NULLABLE_DEFAULT_INIT(__val, nullable); \ zend_string *__class_name = zend_string_init(ZEND_STRL(#class_name), 1); \ PHP_AMQP_DECLARE_TYPED_PROPERTY_ZVAL( \ class_entry, \ name, \ flags, \ PHP_AMQP_DECLARE_PROPERTY_OBJ_TYPE(__class_name, nullable), \ __val \ ); \ } #include "amqp_connection_resource.h" #define AMQP_NOPARAM 0 /* Where is 1?*/ #define AMQP_JUST_CONSUME 1 #define AMQP_DURABLE 2 #define AMQP_PASSIVE 4 #define AMQP_EXCLUSIVE 8 #define AMQP_AUTODELETE 16 #define AMQP_INTERNAL 32 #define AMQP_NOLOCAL 64 #define AMQP_AUTOACK 128 #define AMQP_IFEMPTY 256 #define AMQP_IFUNUSED 512 #define AMQP_MANDATORY 1024 #define AMQP_IMMEDIATE 2048 #define AMQP_MULTIPLE 4096 #define AMQP_NOWAIT 8192 #define AMQP_REQUEUE 16384 /* passive, durable, auto-delete, internal, no-wait (see https://www.rabbitmq.com/amqp-0-9-1-reference.html#exchange.declare) */ #define PHP_AMQP_EXCHANGE_FLAGS (AMQP_PASSIVE | AMQP_DURABLE | AMQP_AUTODELETE | AMQP_INTERNAL) /* passive, durable, exclusive, auto-delete, no-wait (see https://www.rabbitmq.com/amqp-0-9-1-reference.html#queue.declare) */ /* We don't support no-wait flag */ #define PHP_AMQP_QUEUE_FLAGS (AMQP_PASSIVE | AMQP_DURABLE | AMQP_EXCLUSIVE | AMQP_AUTODELETE) #define AMQP_EX_TYPE_DIRECT "direct" #define AMQP_EX_TYPE_FANOUT "fanout" #define AMQP_EX_TYPE_TOPIC "topic" #define AMQP_EX_TYPE_HEADERS "headers" #define PHP_AMQP_CONNECTION_RES_NAME "AMQP Connection Resource" struct _amqp_channel_resource { char is_connected; amqp_channel_t channel_id; amqp_connection_resource *connection_resource; amqp_channel_object *parent; }; struct _amqp_callback_bucket { zend_fcall_info fci; zend_fcall_info_cache fcc; }; struct _amqp_channel_callbacks { amqp_callback_bucket basic_return; amqp_callback_bucket basic_ack; amqp_callback_bucket basic_nack; }; /* NOTE: due to how internally PHP works with custom object, zend_object position in structure matters */ struct _amqp_channel_object { amqp_channel_callbacks callbacks; zval *gc_data; int gc_data_count; amqp_channel_resource *channel_resource; zend_object zo; }; struct _amqp_connection_resource { bool is_connected; bool is_persistent; bool is_dirty; zend_resource *resource; amqp_connection_object *parent; amqp_channel_t max_slots; amqp_channel_t used_slots; amqp_channel_resource **slots; amqp_connection_state_t connection_state; amqp_socket_t *socket; }; struct _amqp_connection_object { amqp_connection_resource *connection_resource; zend_object zo; }; #define DEFAULT_PORT "5672" /* default AMQP port */ #define DEFAULT_HOST "localhost" #define DEFAULT_TIMEOUT "" #define DEFAULT_READ_TIMEOUT "0" #define DEFAULT_WRITE_TIMEOUT "0" #define DEFAULT_CONNECT_TIMEOUT "0" #define DEFAULT_RPC_TIMEOUT "0" #define DEFAULT_VHOST "/" #define DEFAULT_LOGIN "guest" #define DEFAULT_PASSWORD "guest" #define DEFAULT_AUTOACK "0" /* These are all strings to facilitate setting default ini values */ #define DEFAULT_PREFETCH_COUNT "3" #define DEFAULT_PREFETCH_SIZE "0" #define DEFAULT_GLOBAL_PREFETCH_COUNT "0" #define DEFAULT_GLOBAL_PREFETCH_SIZE "0" #define DEFAULT_SASL_METHOD AMQP_SASL_METHOD_PLAIN /* Usually, default is 0 which means 65535, but underlying rabbitmq-c library pool allocates minimal pool for each channel, * so it takes a lot of memory to keep all that channels. Even after channel closing that buffer still keep memory allocation. */ /* #define DEFAULT_CHANNELS_PER_CONNECTION AMQP_DEFAULT_MAX_CHANNELS */ #define PHP_AMQP_PROTOCOL_MAX_CHANNELS 256 /* AMQP_DEFAULT_FRAME_SIZE 131072 */ #if PHP_AMQP_PROTOCOL_MAX_CHANNELS > 0 #define PHP_AMQP_MAX_CHANNELS PHP_AMQP_PROTOCOL_MAX_CHANNELS #else #define PHP_AMQP_MAX_CHANNELS \ 65535// Note that the maximum number of channels the protocol supports is 65535 (2^16, with the 0-channel reserved) #endif #define PHP_AMQP_MAX_FRAME_SIZE INT_MAX #define PHP_AMQP_MAX_HEARTBEAT INT_MAX #define PHP_AMQP_MAX_CREDENTIALS_LENGTH 1024 #define PHP_AMQP_MAX_IDENTIFIER_LENGTH 512 #define PHP_AMQP_MIN_PORT 1 #define PHP_AMQP_MAX_PORT 65535 #define PHP_AMQP_MAX_PREFETCH_COUNT UINT16_MAX #define PHP_AMQP_MAX_PREFETCH_SIZE UINT32_MAX #define PHP_AMQP_DEFAULT_CHANNEL_MAX PHP_AMQP_MAX_CHANNELS #define PHP_AMQP_DEFAULT_FRAME_MAX AMQP_DEFAULT_FRAME_SIZE #define PHP_AMQP_DEFAULT_HEARTBEAT AMQP_DEFAULT_HEARTBEAT #define PHP_AMQP_STRINGIFY(value) PHP_AMQP_TO_STRING(value) #define PHP_AMQP_TO_STRING(value) #value #define DEFAULT_CHANNEL_MAX PHP_AMQP_STRINGIFY(PHP_AMQP_MAX_CHANNELS) #define DEFAULT_FRAME_MAX PHP_AMQP_STRINGIFY(PHP_AMQP_DEFAULT_FRAME_MAX) #define DEFAULT_HEARTBEAT PHP_AMQP_STRINGIFY(PHP_AMQP_DEFAULT_HEARTBEAT) #define DEFAULT_CACERT "" #define DEFAULT_CERT "" #define DEFAULT_KEY "" #define DEFAULT_VERIFY "1" #define DEFAULT_SERIALIZATION_DEPTH "128" #define IS_PASSIVE(bitmask) (AMQP_PASSIVE & (bitmask)) ? 1 : 0 #define IS_DURABLE(bitmask) (AMQP_DURABLE & (bitmask)) ? 1 : 0 #define IS_EXCLUSIVE(bitmask) (AMQP_EXCLUSIVE & (bitmask)) ? 1 : 0 #define IS_AUTODELETE(bitmask) (AMQP_AUTODELETE & (bitmask)) ? 1 : 0 #define IS_INTERNAL(bitmask) (AMQP_INTERNAL & (bitmask)) ? 1 : 0 #define PHP_AMQP_NOPARAMS() \ if (zend_parse_parameters_none() == FAILURE) { \ RETURN_THROWS(); \ } #define PHP_AMQP_RETURN_THIS_PROP(prop_name) \ zval *_zv = zend_read_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL(prop_name), 0, &rv); \ RETURN_ZVAL(_zv, 1, 0); #define PHP_AMQP_READ_OBJ_PROP(cls, obj, name) \ zend_read_property((cls), PHP_AMQP_COMPAT_OBJ_P(obj), ZEND_STRL(name), 0, &rv) #define PHP_AMQP_READ_OBJ_PROP_DOUBLE(cls, obj, name) Z_DVAL_P(PHP_AMQP_READ_OBJ_PROP((cls), (obj), (name))) #define PHP_AMQP_READ_THIS_PROP_CE(name, ce) \ zend_read_property((ce), PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL(name), 0, &rv) #define PHP_AMQP_READ_THIS_PROP(name) \ zend_read_property(this_ce, PHP_AMQP_COMPAT_OBJ_P(getThis()), ZEND_STRL(name), 0, &rv) #define PHP_AMQP_READ_THIS_PROP_BOOL(name) Z_TYPE_P(PHP_AMQP_READ_THIS_PROP(name)) == IS_TRUE #define PHP_AMQP_READ_THIS_PROP_STR(name) Z_STRVAL_P(PHP_AMQP_READ_THIS_PROP(name)) #define PHP_AMQP_READ_THIS_PROP_STRLEN(name) \ (Z_TYPE_P(PHP_AMQP_READ_THIS_PROP(name)) == IS_STRING ? Z_STRLEN_P(PHP_AMQP_READ_THIS_PROP(name)) : 0) #define PHP_AMQP_READ_THIS_PROP_ARR(name) Z_ARRVAL_P(PHP_AMQP_READ_THIS_PROP(name)) #define PHP_AMQP_READ_THIS_PROP_LONG(name) Z_LVAL_P(PHP_AMQP_READ_THIS_PROP(name)) #define PHP_AMQP_READ_THIS_PROP_DOUBLE(name) Z_DVAL_P(PHP_AMQP_READ_THIS_PROP(name)) static inline amqp_connection_object *php_amqp_connection_object_fetch(zend_object *obj) { return (amqp_connection_object *) ((char *) obj - XtOffsetOf(amqp_connection_object, zo)); } static inline amqp_channel_object *php_amqp_channel_object_fetch(zend_object *obj) { return (amqp_channel_object *) ((char *) obj - XtOffsetOf(amqp_channel_object, zo)); } #define PHP_AMQP_GET_CONNECTION(obj) php_amqp_connection_object_fetch(Z_OBJ_P(obj)) #define PHP_AMQP_GET_CHANNEL(obj) php_amqp_channel_object_fetch(Z_OBJ_P(obj)) #define PHP_AMQP_FETCH_CONNECTION(obj) php_amqp_connection_object_fetch(obj) #define PHP_AMQP_FETCH_CHANNEL(obj) php_amqp_channel_object_fetch(obj) #define PHP_AMQP_GET_CHANNEL_RESOURCE(obj) \ (IS_OBJECT == Z_TYPE_P(obj) ? (PHP_AMQP_GET_CHANNEL(obj))->channel_resource : NULL) #define PHP_AMQP_VERIFY_CONNECTION_ERROR(error, reason) \ char verify_connection_error_tmp[255]; \ snprintf(verify_connection_error_tmp, 255, "%s %s", error, reason); \ zend_throw_exception(amqp_connection_exception_class_entry, verify_connection_error_tmp, 0); \ return; #define PHP_AMQP_VERIFY_CONNECTION(connection, error) \ if (!connection) { \ PHP_AMQP_VERIFY_CONNECTION_ERROR(error, "Stale reference to the connection object.") \ } \ if (!(connection)->connection_resource || !(connection)->connection_resource->is_connected) { \ PHP_AMQP_VERIFY_CONNECTION_ERROR(error, "No connection available.") \ } #define PHP_AMQP_VERIFY_CHANNEL_ERROR(error, reason) \ char verify_channel_error_tmp[255]; \ snprintf(verify_channel_error_tmp, 255, "%s %s", error, reason); \ zend_throw_exception(amqp_channel_exception_class_entry, verify_channel_error_tmp, 0); \ return; #define PHP_AMQP_VERIFY_CHANNEL_RESOURCE(resource, error) \ if (!resource) { \ PHP_AMQP_VERIFY_CHANNEL_ERROR(error, "Stale reference to the channel object.") \ } \ if (!(resource)->is_connected) { \ PHP_AMQP_VERIFY_CHANNEL_ERROR(error, "No channel available.") \ } \ if (!(resource)->connection_resource) { \ PHP_AMQP_VERIFY_CONNECTION_ERROR(error, "Stale reference to the connection object.") \ } \ if (!(resource)->connection_resource->is_connected) { \ PHP_AMQP_VERIFY_CONNECTION_ERROR(error, "No connection available.") \ } #define PHP_AMQP_VERIFY_CHANNEL_CONNECTION_RESOURCE(resource, error) \ if (!resource) { \ PHP_AMQP_VERIFY_CHANNEL_ERROR(error, "Stale reference to the channel object.") \ } \ if (!(resource)->connection_resource) { \ PHP_AMQP_VERIFY_CONNECTION_ERROR(error, "Stale reference to the connection object.") \ } \ if (!(resource)->connection_resource->is_connected) { \ PHP_AMQP_VERIFY_CONNECTION_ERROR(error, "No connection available.") \ } #define PHP_AMQP_MAYBE_ERROR(res, channel_resource) \ ((AMQP_RESPONSE_NORMAL != (res).reply_type) && \ PHP_AMQP_RESOURCE_RESPONSE_OK != \ php_amqp_error(res, &PHP_AMQP_G(error_message), (channel_resource)->connection_resource, (channel_resource))) #if ZEND_MODULE_API_NO >= 20100000 #define AMQP_OBJECT_PROPERTIES_INIT(obj, ce) object_properties_init(&(obj), ce); #else #define AMQP_OBJECT_PROPERTIES_INIT(obj, ce) \ do { \ zval *tmp; \ zend_hash_copy( \ (obj).properties, \ &(ce)->default_properties, \ (copy_ctor_func_t) zval_add_ref, \ (void *) &tmp, \ sizeof(zval *) \ ); \ } while (0); #endif #define AMQP_ERROR_CATEGORY_MASK (1 << 29) #define PHP_AMQP_RECURSION_DEPTH_LIMIT (1 << 7) #ifdef PHP_WIN32 #define AMQP_OS_SOCKET_TIMEOUT_ERRNO AMQP_ERROR_CATEGORY_MASK | WSAETIMEDOUT #else #define AMQP_OS_SOCKET_TIMEOUT_ERRNO AMQP_ERROR_CATEGORY_MASK | EAGAIN #endif ZEND_BEGIN_MODULE_GLOBALS(amqp) char *error_message; zend_long error_code; zend_long deserialization_depth; zend_long serialization_depth; ZEND_END_MODULE_GLOBALS(amqp) ZEND_EXTERN_MODULE_GLOBALS(amqp) #ifdef ZEND_MODULE_GLOBALS_ACCESSOR #define PHP_AMQP_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(amqp, v) #if defined(ZTS) && defined(COMPILE_DL_WEAK) ZEND_TSRMLS_CACHE_EXTERN(); #endif #else #ifdef ZTS #define PHP_AMQP_G(v) TSRMG(amqp_globals_id, zend_amqp_globals *, v) #else #define PHP_AMQP_G(v) (amqp_globals.v) #endif #endif int php_amqp_error( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *connection_resource, amqp_channel_resource *channel_resource ); int php_amqp_error_advanced( amqp_rpc_reply_t reply, char **message, amqp_connection_resource *connection_resource, amqp_channel_resource *channel_resource, int fail_on_errors ); /** * @deprecated */ void php_amqp_zend_throw_exception( amqp_rpc_reply_t reply, zend_class_entry *exception_ce, const char *message, zend_long code ); void php_amqp_zend_throw_exception_short(amqp_rpc_reply_t reply, zend_class_entry *exception_ce); void php_amqp_maybe_release_buffers_on_channel( amqp_connection_resource *connection_resource, amqp_channel_resource *channel_resource ); bool php_amqp_is_valid_identifier(zend_string *val); bool php_amqp_is_valid_credential(zend_string *val); bool php_amqp_is_valid_port(zend_long val); bool php_amqp_is_valid_timeout(double timeout); bool php_amqp_is_valid_channel_max(zend_long val); bool php_amqp_is_valid_frame_size_max(zend_long val); bool php_amqp_is_valid_heartbeat(zend_long val); bool php_amqp_is_valid_prefetch_count(zend_long val); bool php_amqp_is_valid_prefetch_size(zend_long val); #endif /* PHP_AMQP_H */ amqp-2.1.2/php_amqp_version.h0000644000076500000240000000031014553444052015744 0ustar lstrojnystaff#define PHP_AMQP_VERSION_MAJOR 2 #define PHP_AMQP_VERSION_MINOR 1 #define PHP_AMQP_VERSION_PATCH 2 #define PHP_AMQP_VERSION_EXTRA "" #define PHP_AMQP_VERSION "2.1.2" #define PHP_AMQP_VERSION_ID 20102 amqp-2.1.2/tests/003-channel-consumers.phpt0000644000076500000240000000510414553444052020212 0ustar lstrojnystaff--TEST-- AMQPChannel - consumers --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel1 = new AMQPChannel($cnn); $q1 = new AMQPQueue($channel1); $q1->setName('q1-' . bin2hex(random_bytes(32))); $q1->declareQueue(); $channel2 = new AMQPChannel($cnn); $q2_0 = new AMQPQueue($channel2); $q2_0->setName('q2.0-' . bin2hex(random_bytes(32))); $q2_0->declareQueue(); $q2_1 = new AMQPQueue($channel2); $q2_1->setName('q2.1-' . bin2hex(random_bytes(32))); $q2_1->declareQueue(); echo "Channels should have no consumers: c1: ", count($channel1->getConsumers()), ', c2: ', count($channel2->getConsumers()), PHP_EOL; $q1->consume(null, AMQP_NOPARAM, 'test-consumer-0'); echo "Channel holds consumer: c1: ", count($channel1->getConsumers()), ', c2: ', count($channel2->getConsumers()), PHP_EOL; $q2_0->consume(null, AMQP_NOPARAM, 'test-consumer-2-0'); $q2_1->consume(null, AMQP_NOPARAM, 'test-consumer-2-1'); echo "Channel holds consumer: c1: ", count($channel1->getConsumers()), ', c2: ', count($channel2->getConsumers()), PHP_EOL; echo PHP_EOL; echo "Consumers belongs to their channels:", PHP_EOL; echo "c1:", PHP_EOL; foreach ($channel1->getConsumers() as $tag => $queue) { echo ' ', $tag, ': ', $queue->getName(), PHP_EOL; } echo "c2:", PHP_EOL; foreach ($channel2->getConsumers() as $tag => $queue) { echo ' ', $tag, ': ', $queue->getName(), PHP_EOL; } echo PHP_EOL; $q1->cancel(); echo "Consumer removed after canceling: c1: ", count($channel1->getConsumers()), ', c2: ', count($channel2->getConsumers()), PHP_EOL; $q2_0 = null; $q2_1 = null; echo "Consumer still stored after source variable been destroyed: c1: ", count($channel1->getConsumers()), ', c2: ', count($channel2->getConsumers()), PHP_EOL; foreach ($channel2->getConsumers() as $tag => $queue) { $queue->cancel(); } echo "Consumer removed after canceling: c1: ", count($channel1->getConsumers()), ', c2: ', count($channel2->getConsumers()), PHP_EOL; ?> --EXPECTF-- Channels should have no consumers: c1: 0, c2: 0 Channel holds consumer: c1: 1, c2: 0 Channel holds consumer: c1: 1, c2: 2 Consumers belongs to their channels: c1: test-consumer-0: q1-%s c2: test-consumer-2-0: q2.0-%s test-consumer-2-1: q2.1-%s Consumer removed after canceling: c1: 0, c2: 2 Consumer still stored after source variable been destroyed: c1: 0, c2: 2 Consumer removed after canceling: c1: 0, c2: 0 amqp-2.1.2/tests/004-queue-consume-nested.phpt0000644000076500000240000000760314553444052020650 0ustar lstrojnystaff--TEST-- AMQPQueue - nested consumers --SKIPIF-- --FILE-- setName('ex1-' . bin2hex(random_bytes(32))); $ex1->setType(AMQP_EX_TYPE_FANOUT); $ex1->declareExchange(); $q1 = new AMQPQueue($channel1); $q1->setName('q1-' . bin2hex(random_bytes(32))); $q1->declareQueue(); $q1->bind($ex1->getName()); $cnt1 = 4; $cnt2 = 4; $nested_publish = true; for($i=0; $i < $cnt1; $i++) { $ex1->publish("message 1 - {$i}"); } $q1->consume(function (\AMQPEnvelope $message, \AMQPQueue $queue) use (&$cnt1, &$cnt2, &$nested_publish) { $queue->ack($message->getDeliveryTag()); printf("1: %s [%s] %s - %s (%s): %s queue\n", $message->getExchangeName(), $message->getBody(), $message->getConsumerTag(), $queue->getConsumerTag(), $queue->getName(), $message->getConsumerTag() == $queue->getConsumerTag() ? 'valid' : 'not valid'); $channel2 = new \AMQPChannel($queue->getConnection()); $ex2 = new AMQPExchange($channel2); $ex2->setName('ex2-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); $q2 = new AMQPQueue($channel2); $q2->setName('q2-' . bin2hex(random_bytes(32))); $q2->declareQueue(); $q2->bind($ex2->getName()); if ($nested_publish) { for($i=0; $i < $cnt2; $i++) { $ex2->publish("message 2 - {$i}"); } $nested_publish = false; } $q2->consume(function (AMQPEnvelope $message, AMQPQueue $queue) use (&$cnt2) { printf("2: %s [%s] %s - %s (%s): %s queue\n", $message->getExchangeName(), $message->getBody(), $message->getConsumerTag(), $queue->getConsumerTag(), $queue->getName(), $message->getConsumerTag() == $queue->getConsumerTag() ? 'valid' : 'not valid'); $queue->ack($message->getDeliveryTag()); return --$cnt2 > 1; }); return --$cnt1 > 1; }); } $cnn1 = new AMQPConnection(); $cnn1->setHost(getenv('PHP_AMQP_HOST')); $cnn1->connect(); $channel1 = new AMQPChannel($cnn1); echo 'With default prefetch = 3', PHP_EOL; test($channel1); $channel1->close(); $channel1 = null; $cnn1->disconnect(); $cnn1 = null; // var_dump($channel1); $cnn2 = new AMQPConnection(); $cnn2->setHost(getenv('PHP_AMQP_HOST')); $cnn2->connect(); $channel2 = new AMQPChannel($cnn2); $channel2->setPrefetchCount(1); echo 'With prefetch = 1', PHP_EOL; test($channel2); ?> --EXPECTF-- With default prefetch = 3 1: ex1-%s [message 1 - 0] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue 2: ex1-%s [message 1 - 1] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue 2: ex1-%s [message 1 - 2] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue 2: ex1-%s [message 1 - 3] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue 1: ex2-%s [message 2 - 0] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue 2: ex2-%s [message 2 - 1] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue 1: ex2-%s [message 2 - 2] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue 2: ex2-%s [message 2 - 3] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue With prefetch = 1 1: ex1-%s [message 1 - 0] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue 2: ex1-%s [message 1 - 1] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue 2: ex2-%s [message 2 - 0] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue 2: ex2-%s [message 2 - 1] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue 1: ex2-%s [message 2 - 2] amq.ctag-%s - amq.ctag-%s (q2-%s): valid queue 2: ex%d-%s [message %d - %d] amq.ctag-%s - amq.ctag-%s (q%d-%s): valid queue 1: ex%d-%s [message %d - %d] amq.ctag-%s - amq.ctag-%s (q%d-%s): valid queue 2: ex1-%s [message 1 - 3] amq.ctag-%s - amq.ctag-%s (q1-%s): valid queue amqp-2.1.2/tests/004-queue-consume-orphaned.phpt0000644000076500000240000000500614553444052021161 0ustar lstrojnystaff--TEST-- AMQPQueue - orphaned envelope --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel1 = new AMQPChannel($cnn); $ex1 = new AMQPExchange($channel1); $ex1->setName('ex1-' . bin2hex(random_bytes(32))); $ex1->setType(AMQP_EX_TYPE_FANOUT); $ex1->declareExchange(); $q1 = new AMQPQueue($channel1); $q1->setName('q1-' . bin2hex(random_bytes(32))); $q1->declareQueue(); $q1->bind($ex1->getName()); $ex1->publish("test passed"); $ex1->publish("test orphaned"); $q1->consume(function (AMQPEnvelope $message, AMQPQueue $queue) { $queue->ack($message->getDeliveryTag()); return false; }); $q1->cancel(); $q1 = null; $q2 = new AMQPQueue($channel1); $q2->setName('q1-' . bin2hex(random_bytes(32))); $q2->declareQueue(); $q2->bind($ex1->getName()); try { $q2->consume(function (AMQPEnvelope $message, AMQPQueue $queue) { $queue->ack($message->getDeliveryTag()); return false; }); } catch (AMQPEnvelopeException $e) { echo get_class($e), ': ', $e->getMessage(), ':', PHP_EOL, PHP_EOL; var_dump($e->getEnvelope()); } ?> --EXPECTF-- AMQPEnvelopeException: Orphaned envelope: object(AMQPEnvelope)#6 (20) { ["contentType":"AMQPBasicProperties":private]=> string(10) "text/plain" ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(0) { } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> int(0) ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL ["body":"AMQPEnvelope":private]=> string(13) "test orphaned" ["consumerTag":"AMQPEnvelope":private]=> string(31) "amq.ctag-%s" ["deliveryTag":"AMQPEnvelope":private]=> int(2) ["isRedelivery":"AMQPEnvelope":private]=> bool(false) ["exchangeName":"AMQPEnvelope":private]=> string(%d) "ex1-%s" ["routingKey":"AMQPEnvelope":private]=> string(0) "" } amqp-2.1.2/tests/amqp_version.phpt0000644000076500000240000000074514553444052016777 0ustar lstrojnystaff--TEST-- AMQP extension version constants --SKIPIF-- --FILE-- ==DONE== --EXPECTF-- string(%d) "%d.%d.%s" int(%d) int(%d) int(%d) string(%d) "%S" int(%d) ==DONE== amqp-2.1.2/tests/amqpbasicproperties.phpt0000644000076500000240000000713714553444052020353 0ustar lstrojnystaff--TEST-- AMQPBasicProperties --SKIPIF-- --FILE-- 'headers'), 42, 24, "correlation_id", "reply_to", "expiration", "message_id", 99999, "type", "user_id", "app_id", "cluster_id" ); var_dump($props); dump_methods($props); ?> --EXPECT-- object(AMQPBasicProperties)#1 (14) { ["contentType":"AMQPBasicProperties":private]=> NULL ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(0) { } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> NULL ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL } AMQPBasicProperties getContentType(): NULL getContentEncoding(): NULL getHeaders(): array(0) { } getDeliveryMode(): int(1) getPriority(): int(0) getCorrelationId(): NULL getReplyTo(): NULL getExpiration(): NULL getMessageId(): NULL getTimestamp(): NULL getType(): NULL getUserId(): NULL getAppId(): NULL getClusterId(): NULL object(AMQPBasicProperties)#2 (14) { ["contentType":"AMQPBasicProperties":private]=> string(12) "content_type" ["contentEncoding":"AMQPBasicProperties":private]=> string(16) "content_encoding" ["headers":"AMQPBasicProperties":private]=> array(1) { ["test"]=> string(7) "headers" } ["deliveryMode":"AMQPBasicProperties":private]=> int(42) ["priority":"AMQPBasicProperties":private]=> int(24) ["correlationId":"AMQPBasicProperties":private]=> string(14) "correlation_id" ["replyTo":"AMQPBasicProperties":private]=> string(8) "reply_to" ["expiration":"AMQPBasicProperties":private]=> string(10) "expiration" ["messageId":"AMQPBasicProperties":private]=> string(10) "message_id" ["timestamp":"AMQPBasicProperties":private]=> int(99999) ["type":"AMQPBasicProperties":private]=> string(4) "type" ["userId":"AMQPBasicProperties":private]=> string(7) "user_id" ["appId":"AMQPBasicProperties":private]=> string(6) "app_id" ["clusterId":"AMQPBasicProperties":private]=> string(10) "cluster_id" } AMQPBasicProperties getContentType(): string(12) "content_type" getContentEncoding(): string(16) "content_encoding" getHeaders(): array(1) { ["test"]=> string(7) "headers" } getDeliveryMode(): int(42) getPriority(): int(24) getCorrelationId(): string(14) "correlation_id" getReplyTo(): string(8) "reply_to" getExpiration(): string(10) "expiration" getMessageId(): string(10) "message_id" getTimestamp(): int(99999) getType(): string(4) "type" getUserId(): string(7) "user_id" getAppId(): string(6) "app_id" getClusterId(): string(10) "cluster_id" amqp-2.1.2/tests/amqpbasicproperties_nullability.phpt0000644000076500000240000000345614553444052022763 0ustar lstrojnystaff--TEST-- AMQPBasicProperties - explicit nullability --SKIPIF-- --FILE-- 'headers'), 42, 24, null, null, null, null, null, null, null, null, null ); var_dump($props); dump_methods($props); ?> --EXPECT-- object(AMQPBasicProperties)#1 (14) { ["contentType":"AMQPBasicProperties":private]=> NULL ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(1) { ["test"]=> string(7) "headers" } ["deliveryMode":"AMQPBasicProperties":private]=> int(42) ["priority":"AMQPBasicProperties":private]=> int(24) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> NULL ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL } AMQPBasicProperties getContentType(): NULL getContentEncoding(): NULL getHeaders(): array(1) { ["test"]=> string(7) "headers" } getDeliveryMode(): int(42) getPriority(): int(24) getCorrelationId(): NULL getReplyTo(): NULL getExpiration(): NULL getMessageId(): NULL getTimestamp(): NULL getType(): NULL getUserId(): NULL getAppId(): NULL getClusterId(): NULL amqp-2.1.2/tests/amqpchannel_basicRecover.phpt0000644000076500000240000000674514553444052021260 0ustar lstrojnystaff--TEST-- AMQPChannel::basicRecover --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn_1->connect(); $channel_1 = new AMQPChannel($cnn_1); $channel_1->setPrefetchCount(5); $exchange_1 = new AMQPExchange($channel_1); $exchange_1->setType(AMQP_EX_TYPE_TOPIC); $exchange_1->setName('test_' . $time); $exchange_1->setFlags(AMQP_AUTODELETE); $exchange_1->declareExchange(); $queue_1 = new AMQPQueue($channel_1); $queue_1->setName('test_' . $time); $queue_1->setFlags(AMQP_DURABLE); $queue_1->declareQueue(); $queue_1->bind($exchange_1->getName(), 'test'); $messages_count = 0; while ($messages_count++ < 10) { $exchange_1->publish('test message #' . $messages_count, 'test'); //echo 'published test message #' . $messages_count, PHP_EOL; } $consume = 2; // NOTE: by default prefetch-count=3, so in consumer below we will ignore prefetched messages 3-5, // and they will not seen by other consumers until we redeliver it. $queue_1->consume(function(AMQPEnvelope $e, AMQPQueue $q) use (&$consume) { echo 'consumed ', $e->getBody(), ' ', ($e->isRedelivery() ? '(redelivered)' : '(original)'), PHP_EOL; $q->ack($e->getDeliveryTag()); return (-- $consume > 0); }); $queue_1->cancel(); // we have to do that to prevent redelivering to the same consumer $cnn_2 = new AMQPConnection(); $cnn_2->setReadTimeout(1); $cnn_2->setHost(getenv('PHP_AMQP_HOST')); $cnn_2->connect(); $channel_2 = new AMQPChannel($cnn_2); $channel_2->setPrefetchCount(8); $queue_2 = new AMQPQueue($channel_2); $queue_2->setName('test_' . $time); $consume = 10; try { $queue_2->consume(function (AMQPEnvelope $e, AMQPQueue $q) use (&$consume) { echo 'consumed ' . $e->getBody(), ' ', ($e->isRedelivery() ? '(redelivered)' : '(original)'), PHP_EOL; $q->ack($e->getDeliveryTag()); return (--$consume > 0); }); } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } $queue_2->cancel(); //var_dump($cnn_2, $channel_2);die; // yes, we do it repeatedly, basic.recover works in a slightly different way than it looks like. As it said, // it "asks the server to redeliver all unacknowledged messages on a specified channel. // ZERO OR MORE messages MAY BE redelivered" $channel_1->basicRecover(); echo 'redelivered', PHP_EOL; $consume = 10; try { $queue_2->consume(function (AMQPEnvelope $e, AMQPQueue $q) use (&$consume) { echo 'consumed ' . $e->getBody(), ' ', ($e->isRedelivery() ? '(redelivered)' : '(original)'), PHP_EOL; $q->ack($e->getDeliveryTag()); return (--$consume > 0); }); } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECT-- consumed test message #1 (original) consumed test message #2 (original) consumed test message #8 (original) consumed test message #9 (original) consumed test message #10 (original) AMQPQueueException(0): Consumer timeout exceed redelivered consumed test message #3 (redelivered) consumed test message #4 (redelivered) consumed test message #5 (redelivered) consumed test message #6 (redelivered) consumed test message #7 (redelivered) AMQPQueueException(0): Consumer timeout exceed amqp-2.1.2/tests/amqpchannel_close.phpt0000644000076500000240000000302214553444052017737 0ustar lstrojnystaff--TEST-- AMQPChannel::close --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn_1->connect(); $channel_1 = new AMQPChannel($cnn_1); $channel_1->setPrefetchCount(5); $exchange_1 = new AMQPExchange($channel_1); $exchange_1->setType(AMQP_EX_TYPE_TOPIC); $exchange_1->setName('test_' . $time); $exchange_1->setFlags(AMQP_AUTODELETE); $exchange_1->declareExchange(); $queue_1 = new AMQPQueue($channel_1); $queue_1->setName('test_' . $time); $queue_1->setFlags(AMQP_DURABLE); $queue_1->declareQueue(); $queue_1->bind($exchange_1->getName(), 'test'); $messages_count = 0; while ($messages_count++ < 3) { $exchange_1->publish('test message #' . $messages_count, 'test'); } $msg = $queue_1->get(); echo $msg->getBody(), PHP_EOL; echo 'connected: ', var_export($channel_1->isConnected(), true), PHP_EOL; $channel_1->close(); echo 'connected: ', var_export($channel_1->isConnected(), true), PHP_EOL; try { $queue_1->get(); } catch (AMQPChannelException $e) { echo get_class($e), "({$e->getCode()}): " . $e->getMessage(), PHP_EOL; } $channel_1->close(); echo 'connected: ', var_export($channel_1->isConnected(), true), PHP_EOL; ?> --EXPECT-- test message #1 connected: true connected: false AMQPChannelException(0): Could not get messages from queue. No channel available. connected: false amqp-2.1.2/tests/amqpchannel_confirmSelect.phpt0000644000076500000240000000207614553444052021437 0ustar lstrojnystaff--TEST-- AMQPChannel::confirmSelect() --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->confirmSelect(); echo 'confirm.select: OK', PHP_EOL; try { $ch->startTransaction(); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): " . $e->getMessage(), PHP_EOL; } $ch = new AMQPChannel($cnn); $ch->startTransaction(); echo 'transaction.start: OK', PHP_EOL; try { $ch->confirmSelect(); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): " . $e->getMessage(), PHP_EOL; } ?> --EXPECT-- confirm.select: OK AMQPChannelException(406): Server channel error: 406, message: PRECONDITION_FAILED - cannot switch from confirm to tx mode transaction.start: OK AMQPChannelException(406): Server channel error: 406, message: PRECONDITION_FAILED - cannot switch from tx to confirm mode amqp-2.1.2/tests/amqpchannel_construct_basic.phpt0000644000076500000240000000070514553444052022024 0ustar lstrojnystaff--TEST-- AMQPChannel constructor --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); echo get_class($ch) . "\n"; echo $ch->isConnected() ? 'true' : 'false'; ?> --EXPECT-- AMQPChannel trueamqp-2.1.2/tests/amqpchannel_construct_ini_global_prefetch_count.phpt0000644000076500000240000000117114553444052026130 0ustar lstrojnystaff--TEST-- AMQPChannel - constructor with amqp.global_prefetch_count ini value set --SKIPIF-- --INI-- amqp.global_prefetch_count=123 --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(123) int(0) int(3) int(0) amqp-2.1.2/tests/amqpchannel_construct_ini_global_prefetch_size.phpt0000644000076500000240000000207314553444052025754 0ustar lstrojnystaff--TEST-- AMQPChannel - constructor with amqp.global_prefetch_size ini value set --SKIPIF-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->setGlobalPrefetchSize(123); } catch (AMQPConnectionException $e) { if ($e->getCode() === 540 && strpos($e->getMessage(), "NOT_IMPLEMENTED") !== false) { print "skip prefetch size is not supported by the AMQP server"; } } } ?> --INI-- amqp.global_prefetch_size=123 --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(123) int(3) int(0) amqp-2.1.2/tests/amqpchannel_construct_ini_prefetch_count.phpt0000644000076500000240000000115314553444052024610 0ustar lstrojnystaff--TEST-- AMQPChannel - constructor with amqp.prefetch_count ini value set --SKIPIF-- --INI-- amqp.prefetch_count=123 --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(123) int(0) amqp-2.1.2/tests/amqpchannel_construct_ini_prefetch_size.phpt0000644000076500000240000000204714553444052024435 0ustar lstrojnystaff--TEST-- AMQPChannel - constructor with amqp.prefetch_size ini value set --SKIPIF-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->setPrefetchSize(123); } catch (AMQPConnectionException $e) { if ($e->getCode() === 540 && strpos($e->getMessage(), "NOT_IMPLEMENTED") !== false) { print "skip prefetch size is not supported by the AMQP server"; } } } ?> --INI-- amqp.prefetch_size=123 --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(123) amqp-2.1.2/tests/amqpchannel_getChannelId.phpt0000644000076500000240000000072114553444052021162 0ustar lstrojnystaff--TEST-- AMQPChannel::getChannelId --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getChannelId()); $cnn->disconnect(); var_dump($ch->getChannelId()); ?> --EXPECT-- int(1) int(1)amqp-2.1.2/tests/amqpchannel_get_connection.phpt0000644000076500000240000000132014553444052021627 0ustar lstrojnystaff--TEST-- AMQPChannel getConnection test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $cnn2 = new AMQPConnection(); echo $cnn === $ch->getConnection() ? 'same' : 'not same', PHP_EOL; echo $cnn2 === $ch->getConnection() ? 'same' : 'not same', PHP_EOL; $old_host = $cnn->getHost(); $new_host = 'test'; $ch->getConnection()->setHost($new_host); echo $cnn->getHost() == $new_host ? 'by ref' : 'copy', PHP_EOL; ?> --EXPECT-- same not same by ref amqp-2.1.2/tests/amqpchannel_multi_channel_connection.phpt0000644000076500000240000000122614553444052023677 0ustar lstrojnystaff--TEST-- AMQPConnection - multiple AMQPChannels per AMQPConnection --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); echo get_class($ch) . "\n"; echo $ch->isConnected() ? 'true' : 'false'; echo "\n"; $ch2 = new AMQPChannel($cnn); echo get_class($ch) . "\n"; echo $ch->isConnected() ? 'true' : 'false'; unset($ch2); $ch->setPrefetchCount(10); ?> --EXPECT-- AMQPChannel true AMQPChannel true amqp-2.1.2/tests/amqpchannel_set_global_prefetch_count.phpt0000644000076500000240000000140514553444052024040 0ustar lstrojnystaff--TEST-- AMQPChannel::setGlobalPrefetchCount --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); $ch->setGlobalPrefetchCount(123); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(0) int(123) int(0) int(3) int(0) amqp-2.1.2/tests/amqpchannel_set_global_prefetch_size.phpt0000644000076500000240000000230714553444052023664 0ustar lstrojnystaff--TEST-- AMQPChannel::setGlobalPrefetchSize --SKIPIF-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->setGlobalPrefetchSize(123); } catch (AMQPConnectionException $e) { if ($e->getCode() === 540 && strpos($e->getMessage(), "NOT_IMPLEMENTED") !== false) { print "skip prefetch size is not supported by the AMQP server"; } } } ?> --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); $ch->setGlobalPrefetchSize(123); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(0) int(0) int(123) int(3) int(0) amqp-2.1.2/tests/amqpchannel_set_prefetch_and_global_prefetch_count.phpt0000644000076500000240000000243414553444052026545 0ustar lstrojnystaff--TEST-- AMQPChannel - Setting both consumer and channel wide prefetch counts. --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); $ch->setPrefetchCount(11); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); // Shouldn't affect the prefetch count $ch->setGlobalPrefetchCount(22); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); // Shouldn't affect the global prefetch count $ch->setPrefetchCount(33); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(0) int(0) int(0) int(11) int(0) int(22) int(0) int(11) int(0) int(22) int(0) int(33) int(0) amqp-2.1.2/tests/amqpchannel_set_prefetch_and_global_prefetch_size.phpt0000644000076500000240000000337714553444052026376 0ustar lstrojnystaff--TEST-- AMQPChannel - Setting both consumer and channel wide prefetch sizes. --SKIPIF-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->setPrefetchSize(123); $ch->setGlobalPrefetchSize(123); } catch (AMQPConnectionException $e) { if ($e->getCode() === 540 && strpos($e->getMessage(), "NOT_IMPLEMENTED") !== false) { print "skip prefetch size is not supported by the AMQP server"; } } } ?> --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); $ch->setPrefetchSize(11); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); // Shouldn't affect the prefetch count $ch->setGlobalPrefetchSize(22); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); // Shouldn't affect the global prefetch count $ch->setPrefetchSize(33); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(0) int(0) int(0) int(0) int(11) int(0) int(22) int(0) int(11) int(0) int(22) int(0) int(33) amqp-2.1.2/tests/amqpchannel_set_prefetch_count.phpt0000644000076500000240000000137114553444052022522 0ustar lstrojnystaff--TEST-- AMQPChannel::setPrefetchCount --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); $ch->setPrefetchCount(123); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(0) int(0) int(0) int(123) int(0) amqp-2.1.2/tests/amqpchannel_set_prefetch_size.phpt0000644000076500000240000000226514553444052022347 0ustar lstrojnystaff--TEST-- AMQPChannel::setPrefetchSize --SKIPIF-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->setPrefetchSize(123); } catch (AMQPConnectionException $e) { if ($e->getCode() === 540 && strpos($e->getMessage(), "NOT_IMPLEMENTED") !== false) { print "skip prefetch size is not supported by the AMQP server"; } } } ?> --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); $ch->setPrefetchSize(123); var_dump($ch->getGlobalPrefetchCount()); var_dump($ch->getGlobalPrefetchSize()); var_dump($ch->getPrefetchCount()); var_dump($ch->getPrefetchSize()); ?> --EXPECT-- int(0) int(0) int(3) int(0) int(0) int(0) int(0) int(123) amqp-2.1.2/tests/amqpchannel_slots_usage.phpt0000644000076500000240000000130614553444052021165 0ustar lstrojnystaff--TEST-- AMQPChannel slots usage --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); echo 'Used channels: ', $cnn->getUsedChannels(), PHP_EOL; $ch = new AMQPChannel($cnn); echo 'Used channels: ', $cnn->getUsedChannels(), PHP_EOL; $ch = new AMQPChannel($cnn); echo 'Used channels: ', $cnn->getUsedChannels(), PHP_EOL; $ch = null; echo 'Used channels: ', $cnn->getUsedChannels(), PHP_EOL; ?> --EXPECT-- Used channels: 0 Used channels: 1 Used channels: 1 Used channels: 0 amqp-2.1.2/tests/amqpchannel_validation.phpt0000644000076500000240000000411514553444052020770 0ustar lstrojnystaff--TEST-- AMQPChannel parameter validation --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $chan = new AMQPChannel($cnn); try { $chan->setPrefetchSize(-1); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setPrefetchSize(PHP_INT_MAX); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setGlobalPrefetchSize(-1); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setGlobalPrefetchSize(PHP_INT_MAX); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setPrefetchCount(-1); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setPrefetchCount(PHP_INT_MAX); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setGlobalPrefetchCount(-1); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } try { $chan->setGlobalPrefetchCount(PHP_INT_MAX); } catch (\Throwable $t) { printf("%s: %s\n", get_class($t), $t->getMessage()); } ?> ==DONE== --EXPECTF-- AMQPConnectionException: Parameter 'prefetchSize' must be between 0 and 4294967295. AMQPConnectionException: Parameter 'prefetchSize' must be between 0 and 4294967295. AMQPConnectionException: Parameter 'globalPrefetchSize' must be between 0 and 4294967295. AMQPConnectionException: Parameter 'globalPrefetchSize' must be between 0 and 4294967295. AMQPConnectionException: Parameter 'prefetchCount' must be between 0 and 65535. AMQPConnectionException: Parameter 'prefetchCount' must be between 0 and 65535. AMQPConnectionException: Parameter 'globalPrefetchCount' must be between 0 and 65535. AMQPConnectionException: Parameter 'globalPrefetchCount' must be between 0 and 65535. ==DONE==amqp-2.1.2/tests/amqpchannel_var_dump.phpt0000644000076500000240000000631114553444052020453 0ustar lstrojnystaff--TEST-- AMQPChannel var_dump --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); var_dump($ch); $cnn->disconnect(); var_dump($ch); ?> --EXPECTF-- object(AMQPChannel)#2 (6) { ["connection":"AMQPChannel":private]=> object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } ["prefetchCount":"AMQPChannel":private]=> int(3) ["prefetchSize":"AMQPChannel":private]=> int(0) ["globalPrefetchCount":"AMQPChannel":private]=> int(0) ["globalPrefetchSize":"AMQPChannel":private]=> int(0) ["consumers":"AMQPChannel":private]=> array(0) { } } object(AMQPChannel)#2 (6) { ["connection":"AMQPChannel":private]=> object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } ["prefetchCount":"AMQPChannel":private]=> int(3) ["prefetchSize":"AMQPChannel":private]=> int(0) ["globalPrefetchCount":"AMQPChannel":private]=> int(0) ["globalPrefetchSize":"AMQPChannel":private]=> int(0) ["consumers":"AMQPChannel":private]=> array(0) { } } amqp-2.1.2/tests/amqpconnection_connect_login_failure.phpt0000644000076500000240000000170514553444052023717 0ustar lstrojnystaff--TEST-- AMQPConnection connect login failure --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setLogin('nonexistent-login-'. bin2hex(random_bytes(32))); $cnn->setPassword('nonexistent-password-'. bin2hex(random_bytes(32))); //var_dump($cnn); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; // try { $cnn->connect(); echo 'Connected', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } // echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; ?> --EXPECTF-- disconnected AMQPConnectionException(403): %s disconnectedamqp-2.1.2/tests/amqpconnection_connection_getters.phpt0000644000076500000240000000533214553444052023263 0ustar lstrojnystaff--TEST-- AMQPConnection - connection-specific getters --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'channel_max: ', var_export($cnn->getMaxChannels(), true), PHP_EOL; echo 'frame_max: ', var_export($cnn->getMaxFrameSize(), true), PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo PHP_EOL; $cnn->connect(); echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'channel_max: ', var_export($cnn->getMaxChannels(), true), PHP_EOL; echo 'frame_max: ', var_export($cnn->getMaxFrameSize(), true), PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo PHP_EOL; $cnn->disconnect(); echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'channel_max: ', var_export($cnn->getMaxChannels(), true), PHP_EOL; echo 'frame_max: ', var_export($cnn->getMaxFrameSize(), true), PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo PHP_EOL; $cnn = new AMQPConnection(array('channel_max' => '10', 'frame_max' => 10240, 'heartbeat' => 10)); $cnn->setHost(getenv('PHP_AMQP_HOST')); echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'channel_max: ', var_export($cnn->getMaxChannels(), true), PHP_EOL; echo 'frame_max: ', var_export($cnn->getMaxFrameSize(), true), PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo PHP_EOL; $cnn->connect(); echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'channel_max: ', var_export($cnn->getMaxChannels(), true), PHP_EOL; echo 'frame_max: ', var_export($cnn->getMaxFrameSize(), true), PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo PHP_EOL; $cnn->disconnect(); echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'channel_max: ', var_export($cnn->getMaxChannels(), true), PHP_EOL; echo 'frame_max: ', var_export($cnn->getMaxFrameSize(), true), PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo PHP_EOL; ?> --EXPECT-- connected: false channel_max: 256 frame_max: 131072 heartbeat: 0 connected: true channel_max: 256 frame_max: 131072 heartbeat: 0 connected: false channel_max: 256 frame_max: 131072 heartbeat: 0 connected: false channel_max: 10 frame_max: 10240 heartbeat: 10 connected: true channel_max: 10 frame_max: 10240 heartbeat: 10 connected: false channel_max: 10 frame_max: 10240 heartbeat: 10 amqp-2.1.2/tests/amqpconnection_construct_basic.phpt0000644000076500000240000000076614553444052022562 0ustar lstrojnystaff--TEST-- AMQPConnection constructor --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); echo get_class($cnn) . "\n"; echo $cnn->isConnected() ? 'true' : 'false', PHP_EOL; echo $cnn->isPersistent() ? 'true' : 'false', PHP_EOL; ?> --EXPECT-- AMQPConnection true falseamqp-2.1.2/tests/amqpconnection_construct_ini_read_timeout.phpt0000644000076500000240000000067314553444052025016 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with amqp.read_timeout ini value set --SKIPIF-- --INI-- amqp.read_timeout=202.202 --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getReadTimeout()); ?> --EXPECTF-- float(202.202) amqp-2.1.2/tests/amqpconnection_construct_ini_timeout.phpt0000644000076500000240000000105614553444052024017 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with amqp.timeout ini value set --SKIPIF-- --INI-- amqp.timeout=101.101 --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getReadTimeout()); ?> --EXPECTF-- %s: AMQPConnection::__construct(): INI setting 'amqp.timeout' is deprecated; use 'amqp.read_timeout' instead in %s on line 2 float(101.101) amqp-2.1.2/tests/amqpconnection_construct_ini_timeout_and_read_timeout.phpt0000644000076500000240000000134714553444052027405 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with both amqp.timeout and amqp.read_timeout ini values set --SKIPIF-- --INI-- amqp.timeout = 101.101 amqp.read_timeout = 202.202 --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getReadTimeout()); ?> --EXPECTF-- %s: AMQPConnection::__construct(): INI setting 'amqp.timeout' is deprecated; use 'amqp.read_timeout' instead in %s on line 2 Notice: AMQPConnection::__construct(): INI setting 'amqp.read_timeout' will be used instead of 'amqp.timeout' in %s on line 2 float(202.202) amqp-2.1.2/tests/amqpconnection_construct_ini_timeout_default.phpt0000644000076500000240000000073514553444052025526 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with amqp.timeout ini value set in code to it default value --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getReadTimeout()); ?> --EXPECTF-- float(0) amqp-2.1.2/tests/amqpconnection_construct_params_by_value.phpt0000644000076500000240000000202014553444052024633 0ustar lstrojnystaff--TEST-- Params are passed by value in AMQPConnection::__construct() --SKIPIF-- --FILE-- 'localhost', 'port' => 5432, 'login' => 'login', 'password' => 'password', 'read_timeout' => 10, 'write_timeout' => 10, 'connect_timeout' => 10, 'rpc_timeout' => 10, 'connection_name' => 'custom_connection_name' ]; $cnn = new AMQPConnection($params); echo gettype($params['host']) . PHP_EOL; echo gettype($params['port']) . PHP_EOL; echo gettype($params['login']) . PHP_EOL; echo gettype($params['password']) . PHP_EOL; echo gettype($params['read_timeout']) . PHP_EOL; echo gettype($params['write_timeout']) . PHP_EOL; echo gettype($params['connect_timeout']) . PHP_EOL; echo gettype($params['rpc_timeout']) . PHP_EOL; echo gettype($params['connection_name']) . PHP_EOL; --EXPECT-- string integer string string integer integer integer integer string amqp-2.1.2/tests/amqpconnection_construct_with_connect_timeout.phpt0000644000076500000240000000271214553444052025724 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with timeout parameter in credentials --SKIPIF-- --FILE-- -1.5)); } catch (AMQPConnectionException $e) { echo $e->getMessage(), PHP_EOL; } $timeout = 10.5; // resolve hostname to don't waste time on resolve inside library while resolve operations are not under timings limit (yet) $credentials = array('host' => gethostbyname('google.com'), 'connect_timeout' => $timeout); //$credentials = array('host' => 'google.com', 'connect_timeout' => $timeout); $cnn = new AMQPConnection($credentials); $start = microtime(true); try { $cnn->connect(); } catch (AMQPConnectionException $e) { echo $e->getMessage(), PHP_EOL; $end = microtime(true); $error = $end - $start - $timeout; $limit = abs(log10($timeout)); // empirical value echo 'error: ', $error, PHP_EOL; echo 'limit: ', $limit, PHP_EOL; echo abs($error) <= $limit ? 'timings OK' : 'timings failed'; // error should be less than 5% of timeout value } ?> --EXPECTF-- Parameter 'connect_timeout' must be greater than or equal to zero. Socket error: could not connect to host, request timed out error: %f limit: %f timings OK amqp-2.1.2/tests/amqpconnection_construct_with_connection_name.phpt0000644000076500000240000000113714553444052025664 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with connection_name parameter in credentials --SKIPIF-- --FILE-- "custom connection name"); $cnn = new AMQPConnection($credentials); var_dump($cnn->getConnectionName()); // Test explicitly setting connection name as null $credentials = array('connection_name' => null); $cnn = new AMQPConnection($credentials); var_dump($cnn->getConnectionName()); ?> --EXPECT-- string(22) "custom connection name" NULL amqp-2.1.2/tests/amqpconnection_construct_with_limits.phpt0000644000076500000240000000275514553444052024035 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with channel_max, frame_max and heartbeat limits --SKIPIF-- --FILE-- 10, 'frame_max' => 10240, 'heartbeat' => 5, ); $cnn = new AMQPConnection($credentials); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); var_dump($cnn); ?> --EXPECTF-- object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(10240) ["channelMax":"AMQPConnection":private]=> int(10) ["heartbeat":"AMQPConnection":private]=> int(5) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } amqp-2.1.2/tests/amqpconnection_construct_with_rpc_timeout.phpt0000644000076500000240000000052214553444052025054 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with rpc_timeout parameter in credentials --SKIPIF-- --FILE-- 303.303); $cnn = new AMQPConnection($credentials); var_dump($cnn->getRpcTimeout()); ?> --EXPECT-- float(303.303) amqp-2.1.2/tests/amqpconnection_construct_with_timeout.phpt0000644000076500000240000000067514553444052024221 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with timeout parameter in credentials --SKIPIF-- --FILE-- 101.101); $cnn = new AMQPConnection($credentials); var_dump($cnn->getReadTimeout()); ?> --EXPECTF-- %s: AMQPConnection::__construct(): Parameter 'timeout' is deprecated; use 'read_timeout' instead in %s on line 3 float(101.101) amqp-2.1.2/tests/amqpconnection_construct_with_timeout_and_read_timeout.phpt0000644000076500000240000000076414553444052027603 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with both timeout and read_timeout parameters in credentials --SKIPIF-- --FILE-- 101.101, 'read_timeout' => 202.202); $cnn = new AMQPConnection($credentials); var_dump($cnn->getReadTimeout()); ?> --EXPECTF-- Notice: AMQPConnection::__construct(): Parameter 'timeout' is deprecated, 'read_timeout' used instead in %s on line 3 float(202.202) amqp-2.1.2/tests/amqpconnection_construct_with_verify_false.phpt0000644000076500000240000000047614553444052025210 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with verify parameter set to false in $params --SKIPIF-- --FILE-- false); $cnn = new AMQPConnection($params); var_dump($cnn->getVerify()); ?> --EXPECT-- bool(false) amqp-2.1.2/tests/amqpconnection_construct_with_write_timeout.phpt0000644000076500000240000000052614553444052025426 0ustar lstrojnystaff--TEST-- AMQPConnection constructor with write_timeout parameter in $cnntials --SKIPIF-- --FILE-- 303.303); $cnn = new AMQPConnection($credentials); var_dump($cnn->getWriteTimeout()); ?> --EXPECT-- float(303.303) amqp-2.1.2/tests/amqpconnection_getUsedChannels.phpt0000644000076500000240000000166214553444052022445 0ustar lstrojnystaff--TEST-- AMQPConnection::getUsedChannels() --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); echo get_class($cnn), '::getUsedChannels():', $cnn->getUsedChannels(), PHP_EOL; $cnn->connect(); echo get_class($cnn), '::getUsedChannels():', $cnn->getUsedChannels(), PHP_EOL; $ch = new AMQPChannel($cnn); echo get_class($cnn), '::getUsedChannels():', $cnn->getUsedChannels(), PHP_EOL; $ch = null; echo get_class($cnn), '::getUsedChannels():', $cnn->getUsedChannels(), PHP_EOL; ?> --EXPECTF-- AMQPConnection::getUsedChannels(): Warning: AMQPConnection::getUsedChannels(): Connection is not connected. in %s on line %d 0 AMQPConnection::getUsedChannels():0 AMQPConnection::getUsedChannels():1 AMQPConnection::getUsedChannels():0 amqp-2.1.2/tests/amqpconnection_heartbeat.phpt0000644000076500000240000000246414553444052021331 0ustar lstrojnystaff--TEST-- AMQPConnection - heartbeats support --SKIPIF-- --FILE-- $heartbeat); $cnn = new AMQPConnection($credentials); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; sleep($heartbeat*5); try { $ch = new AMQPChannel($cnn); echo 'channel created', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; ?> --EXPECTREGEX-- heartbeat: 2 connected: true persistent: false AMQPConnectionException\(0\): (a socket error occurred|connection closed unexpectedly) heartbeat: 2 connected: false persistent: false amqp-2.1.2/tests/amqpconnection_heartbeat_with_consumer.phpt0000644000076500000240000000545514553444052024302 0ustar lstrojnystaff--TEST-- AMQPConnection heartbeats support (with active consumer) --SKIPIF-- --FILE-- $heartbeat, 'read_timeout' => $heartbeat * 20); $cnn = new AMQPConnection($credentials); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); var_dump($cnn); $ch = new AMQPChannel($cnn); $q_dead_name = 'test.queue.dead.' . bin2hex(random_bytes(32)); $q_name = 'test.queue.' . bin2hex(random_bytes(32)); $e = new AMQPExchange($ch); $q = new AMQPQueue($ch); $q->setName($q_name); $q->declareQueue(); $q_dead = new AMQPQueue($ch); $q_dead->setName($q_dead_name); $q_dead->setArgument('x-dead-letter-exchange', ''); $q_dead->setArgument('x-dead-letter-routing-key', $q_name); $q_dead->setArgument('x-message-ttl', $heartbeat * 10 * 1000); $q_dead->declareQueue(); $e->publish('test message 1 (should be dead lettered)', $q_dead_name); $t = microtime(true); $q->consume(function (AMQPEnvelope $envelope) { echo 'Consumed: ', $envelope->getBody(), PHP_EOL; return false; }); $t = microtime(true) - $t; echo 'Consuming took: ', (float) round($t, 4), 'sec', PHP_EOL; $t_min = (float)round($heartbeat * 9.5, 4); $t_max = (float)round($heartbeat * 10.5, 4); if ($t > $t_min && $t < $t_max) { echo "Timing OK ($t_min < $t < $t_max)", PHP_EOL; } else { echo "Timing ERROR ($t_min < $t < $t_max)", PHP_EOL; } $ch2 = new AMQPChannel($cnn); sleep($heartbeat/2); $ch3 = new AMQPChannel($cnn); echo 'Done', PHP_EOL ?> --EXPECTF-- object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(40) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(2) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } Consumed: test message 1 (should be dead lettered) Consuming took: %fsec Timing OK (%f < %f < %f) Done amqp-2.1.2/tests/amqpconnection_heartbeat_with_persistent.phpt0000644000076500000240000000526114553444052024642 0ustar lstrojnystaff--TEST-- AMQPConnection - heartbeats support with persistent connections --SKIPIF-- --FILE-- $heartbeat); $cnn = new AMQPConnection($credentials); $cnn->setHost(getenv('PHP_AMQP_HOST')); echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; echo PHP_EOL; $cnn->pconnect(); echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; echo PHP_EOL; sleep($heartbeat*5); try { $ch = new AMQPChannel($cnn); echo 'channel created', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; echo PHP_EOL; $cnn = new AMQPConnection($credentials); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->pconnect(); echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; echo PHP_EOL; $ch = new AMQPChannel($cnn); echo 'channel created', PHP_EOL; echo PHP_EOL; echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; echo PHP_EOL; $cnn->pdisconnect(); echo 'heartbeat: ', var_export($cnn->getHeartbeatInterval(), true), PHP_EOL; echo 'connected: ', var_export($cnn->isConnected(), true), PHP_EOL; echo 'persistent: ', var_export($cnn->isPersistent(), true), PHP_EOL; echo PHP_EOL; ?> --EXPECTREGEX-- heartbeat: 2 connected: false persistent: false heartbeat: 2 connected: true persistent: true AMQPConnectionException\(0\): (a socket error occurred|connection closed unexpectedly) heartbeat: 2 connected: false persistent: false heartbeat: 2 connected: true persistent: true channel created heartbeat: 2 connected: true persistent: true heartbeat: 2 connected: false persistent: false amqp-2.1.2/tests/amqpconnection_nullable_setters.phpt0000644000076500000240000000167314553444052022742 0ustar lstrojnystaff--TEST-- AMQPConnection - setters and nullability --SKIPIF-- --FILE-- setKey('key'); var_dump($c->getKey()); $c->setKey(null); var_dump($c->getKey()); $c->setKey(''); var_dump($c->getKey()); $c->setCert('cert'); var_dump($c->getCert()); $c->setCert(null); var_dump($c->getCert()); $c->setCert(''); var_dump($c->getCert()); $c->setCACert('cacert'); var_dump($c->getCACert()); $c->setCACert(null); var_dump($c->getCACert()); $c->setCACert(''); var_dump($c->getCACert()); $c->setConnectionName('con'); var_dump($c->getConnectionName()); $c->setConnectionName(null); var_dump($c->getConnectionName()); $c->setConnectionName(''); var_dump($c->getConnectionName()); ?> ==DONE== --EXPECT-- string(3) "key" NULL string(0) "" string(4) "cert" NULL string(0) "" string(6) "cacert" NULL string(0) "" string(3) "con" NULL string(0) "" ==DONE==amqp-2.1.2/tests/amqpconnection_persistent_construct_basic.phpt0000644000076500000240000000100014553444052025020 0ustar lstrojnystaff--TEST-- AMQPConnection persitent constructor --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->pconnect(); echo get_class($cnn) . "\n"; echo $cnn->isConnected() ? 'true' : 'false', PHP_EOL; echo $cnn->isPersistent() ? 'true' : 'false', PHP_EOL; ?> --EXPECT-- AMQPConnection true trueamqp-2.1.2/tests/amqpconnection_persistent_in_use.phpt0000644000076500000240000000167614553444052023140 0ustar lstrojnystaff--TEST-- AMQPConnection persitent connection resource can't be used by multiple connection --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); echo get_class($cnn), PHP_EOL; $cnn->pconnect(); echo $cnn->isConnected() ? 'true' : 'false', PHP_EOL; echo PHP_EOL; $cnn2 = new AMQPConnection(); $cnn2->setHost(getenv('PHP_AMQP_HOST')); echo get_class($cnn), PHP_EOL; try { $cnn2->pconnect(); echo 'reused', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo $cnn->isConnected() ? 'true' : 'false', PHP_EOL; ?> --EXPECT-- AMQPConnection true AMQPConnection AMQPConnectionException(0): There are already established persistent connection to the same resource. trueamqp-2.1.2/tests/amqpconnection_persistent_reusable.phpt0000644000076500000240000000200514553444052023443 0ustar lstrojnystaff--TEST-- AMQPConnection persistent connection are reusable --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->pconnect(); echo get_class($cnn), PHP_EOL; echo $cnn->isConnected() ? 'true' : 'false', PHP_EOL; if ($manual) { $ch = new AMQPChannel($cnn); sleep(10); $ch = null; } $cnn = null; echo PHP_EOL; if ($manual) { sleep(10); } $cnn = new AMQPConnection(); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->pconnect(); echo get_class($cnn), PHP_EOL; echo $cnn->isConnected() ? 'true' : 'false', PHP_EOL; if ($manual) { $ch = new AMQPChannel($cnn); sleep(10); $ch = null; } $cnn->pdisconnect(); ?> --EXPECT-- AMQPConnection true AMQPConnection true amqp-2.1.2/tests/amqpconnection_setConnectionName.phpt0000644000076500000240000000106414553444052023001 0ustar lstrojnystaff--TEST-- AMQPConnection setConnectionName --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getConnectionName()); $cnn->setConnectionName('custom connection name'); var_dump($cnn->getConnectionName()); $cnn->setConnectionName(null); var_dump($cnn->getConnectionName()); --EXPECTF-- NULL string(22) "custom connection name" NULLamqp-2.1.2/tests/amqpconnection_setHost.phpt0000644000076500000240000000047114553444052021017 0ustar lstrojnystaff--TEST-- AMQPConnection setHost --SKIPIF-- --FILE-- getHost()); $cnn->setHost('nonexistent'); var_dump($cnn->getHost()); --EXPECTF-- string(9) "localhost" string(11) "nonexistent" amqp-2.1.2/tests/amqpconnection_setLogin.phpt0000644000076500000240000000067714553444052021162 0ustar lstrojnystaff--TEST-- AMQPConnection setLogin --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getLogin()); $cnn->setLogin('nonexistent'); var_dump($cnn->getLogin()); --EXPECTF-- string(5) "guest" string(11) "nonexistent" amqp-2.1.2/tests/amqpconnection_setPassword.phpt0000644000076500000240000000071314553444052021703 0ustar lstrojnystaff--TEST-- AMQPConnection setPassword --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getPassword()); $cnn->setPassword('nonexistent'); var_dump($cnn->getPassword()); --EXPECTF-- string(5) "guest" string(11) "nonexistent" amqp-2.1.2/tests/amqpconnection_setPort_int.phpt0000644000076500000240000000070114553444052021674 0ustar lstrojnystaff--TEST-- AMQPConnection constructor --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $port = 12345; var_dump($cnn->setPort($port)); echo $cnn->getPort(), PHP_EOL; echo gettype($port), PHP_EOL; ?> --EXPECT-- NULL 12345 integer amqp-2.1.2/tests/amqpconnection_setPort_out_of_range.phpt0000644000076500000240000000076014553444052023556 0ustar lstrojnystaff--TEST-- AMQPConnection setPort with int out of range --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); try { $cnn->setPort(1234567890); } catch (Exception $e) { echo $e->getMessage(); } ?> --EXPECT-- Parameter 'port' must be a valid port number between 1 and 65535.amqp-2.1.2/tests/amqpconnection_setPort_string.phpt0000644000076500000240000000071114553444052022411 0ustar lstrojnystaff--TEST-- AMQPConnection setPort with string --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $port = '12345'; var_dump($cnn->setPort($port)); var_dump($cnn->getPort()); var_dump($port); ?> --EXPECT-- NULL int(12345) string(5) "12345" amqp-2.1.2/tests/amqpconnection_setReadTimeout_float.phpt0000644000076500000240000000074014553444052023510 0ustar lstrojnystaff--TEST-- AMQPConnection setReadTimeout float --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(.34); var_dump($cnn->getReadTimeout()); $cnn->setReadTimeout(4.7e-2); var_dump($cnn->getReadTimeout());?> --EXPECT-- float(0.34) float(0.047) amqp-2.1.2/tests/amqpconnection_setReadTimeout_int.phpt0000644000076500000240000000061514553444052023176 0ustar lstrojnystaff--TEST-- AMQPConnection setReadTimeout int --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(3); var_dump($cnn->getReadTimeout()); ?> --EXPECT-- float(3) amqp-2.1.2/tests/amqpconnection_setReadTimeout_out_of_range.phpt0000644000076500000240000000063614553444052025056 0ustar lstrojnystaff--TEST-- AMQPConnection setReadTimeout out of range --SKIPIF-- --FILE-- setReadTimeout(-1); } catch (Exception $e) { echo get_class($e); echo PHP_EOL; echo $e->getMessage(); } ?> --EXPECT-- AMQPConnectionException Parameter 'readTimeout' must be greater than or equal to zero. amqp-2.1.2/tests/amqpconnection_setReadTimeout_string.phpt0000644000076500000240000000074514553444052023716 0ustar lstrojnystaff--TEST-- AMQPConnection setReadTimeout string --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(".34"); var_dump($cnn->getReadTimeout()); $cnn->setReadTimeout("4.7e-2"); var_dump($cnn->getReadTimeout());?> --EXPECT-- float(0.34) float(0.047) amqp-2.1.2/tests/amqpconnection_setRpcTimeout_float.phpt0000644000076500000240000000110714553444052023357 0ustar lstrojnystaff--TEST-- AMQPConnection setRpcTimeout float --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setRpcTimeout($timeout); var_dump($cnn->getRpcTimeout()); var_dump($timeout); $timeout = 4.7e-2; $cnn->setRpcTimeout($timeout); var_dump($cnn->getRpcTimeout()); var_dump($timeout); ?> --EXPECT-- float(0.34) float(0.34) float(0.047) float(0.047) amqp-2.1.2/tests/amqpconnection_setRpcTimeout_int.phpt0000644000076500000240000000067214553444052023052 0ustar lstrojnystaff--TEST-- AMQPConnection setRpcTimeout int --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setRpcTimeout($timeout); var_dump($cnn->getRpcTimeout()); var_dump($timeout); ?> --EXPECT-- float(3) int(3) amqp-2.1.2/tests/amqpconnection_setRpcTimeout_out_of_range.phpt0000644000076500000240000000104114553444052024716 0ustar lstrojnystaff--TEST-- AMQPConnection setRpcTimeout out of range --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); try { $cnn->setRpcTimeout(-1); } catch (Exception $e) { echo get_class($e); echo PHP_EOL; echo $e->getMessage(); } ?> --EXPECT-- AMQPConnectionException Parameter 'rpcTimeout' must be greater than or equal to zero. amqp-2.1.2/tests/amqpconnection_setRpcTimeout_string.phpt0000644000076500000240000000112614553444052023561 0ustar lstrojnystaff--TEST-- AMQPConnection setRpcTimeout string --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setRpcTimeout($timeout); var_dump($cnn->getRpcTimeout()); var_dump($timeout); $timeout = "4.7e-2"; $cnn->setRpcTimeout($timeout); var_dump($cnn->getRpcTimeout()); var_dump($timeout); ?> --EXPECT-- float(0.34) string(3) ".34" float(0.047) string(6) "4.7e-2" amqp-2.1.2/tests/amqpconnection_setSaslMethod.phpt0000644000076500000240000000116514553444052022146 0ustar lstrojnystaff--TEST-- AMQPConnection setSaslMethod int --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setSaslMethod(0); var_dump($cnn->getSaslMethod()); $cnn->setSaslMethod(1); var_dump($cnn->getSaslMethod()); $cnn->setSaslMethod(AMQP_SASL_METHOD_PLAIN); var_dump($cnn->getSaslMethod()); $cnn->setSaslMethod(AMQP_SASL_METHOD_EXTERNAL); var_dump($cnn->getSaslMethod()); ?> --EXPECT-- int(0) int(1) int(0) int(1) amqp-2.1.2/tests/amqpconnection_setSaslMethod_invalid.phpt0000644000076500000240000000107514553444052023654 0ustar lstrojnystaff--TEST-- AMQPConnection setSaslMethod invalid --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); try { $cnn->setSaslMethod(-1); } catch (Exception $e) { echo get_class($e); echo PHP_EOL; echo $e->getMessage(); } ?> --EXPECT-- AMQPConnectionException Invalid SASL method given. Method must be AMQP_SASL_METHOD_PLAIN or AMQP_SASL_METHOD_EXTERNAL. amqp-2.1.2/tests/amqpconnection_setTimeout_deprecated.phpt0000644000076500000240000000104514553444052023706 0ustar lstrojnystaff--TEST-- AMQPConnection setTimeout deprecated --SKIPIF-- --FILE-- setTimeout(0); $cnn->getTimeout(); ?> --EXPECTF-- %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 3 %s: AMQPConnection::getTimeout(): AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead in %s on line 4 amqp-2.1.2/tests/amqpconnection_setTimeout_float.phpt0000644000076500000240000000166214553444052022720 0ustar lstrojnystaff--TEST-- AMQPConnection setTimeout float --SKIPIF-- --FILE-- setTimeout(.34); var_dump($cnn->getTimeout()); $cnn->setTimeout(4.7e-2); var_dump($cnn->getTimeout());?> --EXPECTF-- %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 3 %s: AMQPConnection::getTimeout(): AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead in %s on line 4 float(0.34) %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 5 %s: AMQPConnection::getTimeout(): AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead in %s on line 6 float(0.047) amqp-2.1.2/tests/amqpconnection_setTimeout_int.phpt0000644000076500000240000000106114553444052022376 0ustar lstrojnystaff--TEST-- AMQPConnection setTimeout int --SKIPIF-- --FILE-- setTimeout(3); var_dump($cnn->getTimeout()); ?> --EXPECTF-- %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 3 %s: AMQPConnection::getTimeout(): AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead in %s on line 4 float(3) amqp-2.1.2/tests/amqpconnection_setTimeout_out_of_range.phpt0000644000076500000240000000106514553444052024257 0ustar lstrojnystaff--TEST-- AMQPConnection setTimeout out of range --SKIPIF-- --FILE-- setTimeout(-1); } catch (Exception $e) { echo get_class($e); echo PHP_EOL; echo $e->getMessage(); } ?> --EXPECTF-- %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 4 AMQPConnectionException Parameter 'timeout' must be greater than or equal to zero. amqp-2.1.2/tests/amqpconnection_setTimeout_string.phpt0000644000076500000240000000166714553444052023126 0ustar lstrojnystaff--TEST-- AMQPConnection setTimeout string --SKIPIF-- --FILE-- setTimeout(".34"); var_dump($cnn->getTimeout()); $cnn->setTimeout("4.7e-2"); var_dump($cnn->getTimeout());?> --EXPECTF-- %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 3 %s: AMQPConnection::getTimeout(): AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead in %s on line 4 float(0.34) %s: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line 5 %s: AMQPConnection::getTimeout(): AMQPConnection::getTimeout() method is deprecated; use AMQPConnection::getReadTimeout() instead in %s on line 6 float(0.047) amqp-2.1.2/tests/amqpconnection_setVhost.phpt0000644000076500000240000000067314553444052021211 0ustar lstrojnystaff--TEST-- AMQPConnection setVhost --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->getVhost()); $cnn->setVhost('nonexistent'); var_dump($cnn->getVhost()); --EXPECTF-- string(1) "/" string(11) "nonexistent" amqp-2.1.2/tests/amqpconnection_setWriteTimeout_float.phpt0000644000076500000240000000074514553444052023734 0ustar lstrojnystaff--TEST-- AMQPConnection setWriteTimeout float --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setWriteTimeout(.34); var_dump($cnn->getWriteTimeout()); $cnn->setWriteTimeout(4.7e-2); var_dump($cnn->getWriteTimeout());?> --EXPECT-- float(0.34) float(0.047) amqp-2.1.2/tests/amqpconnection_setWriteTimeout_int.phpt0000644000076500000240000000062014553444052023411 0ustar lstrojnystaff--TEST-- AMQPConnection setWriteTimeout int --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setWriteTimeout(3); var_dump($cnn->getWriteTimeout()); ?> --EXPECT-- float(3) amqp-2.1.2/tests/amqpconnection_setWriteTimeout_out_of_range.phpt0000644000076500000240000000104714553444052025272 0ustar lstrojnystaff--TEST-- AMQPConnection setWriteTimeout out of range --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); try { $cnn->setWriteTimeout(-1); } catch (Exception $e) { echo get_class($e); echo PHP_EOL; echo $e->getMessage(); } ?> --EXPECT-- AMQPConnectionException Parameter 'writeTimeout' must be greater than or equal to zero. amqp-2.1.2/tests/amqpconnection_setWriteTimeout_string.phpt0000644000076500000240000000075314553444052024134 0ustar lstrojnystaff--TEST-- AMQPConnection setWriteTimeout string --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setWriteTimeout(".34"); var_dump($cnn->getWriteTimeout()); $cnn->setWriteTimeout("4.7e-2"); var_dump($cnn->getWriteTimeout()); ?> --EXPECT-- float(0.34) float(0.047) amqp-2.1.2/tests/amqpconnection_tls_basic.phpt0000644000076500000240000000601414553444052021330 0ustar lstrojnystaff--TEST-- AMQPConnection - TLS - CA validation only --SKIPIF-- --FILE-- 5671, 'host' => getenv('PHP_AMQP_SSL_HOST'), 'cacert' => __DIR__ . "/../infra/tls/certificates/testca/cacert.pem", ); $cnn = new AMQPConnection($credentials); var_dump($cnn); $cnn->connect(); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; echo PHP_EOL; $cnn = new AMQPConnection(); $cnn->setPort(5671); $cnn->setHost(getenv('PHP_AMQP_SSL_HOST')); $cnn->setCACert(__DIR__ . "/../infra/tls/certificates/testca/cacert.pem"); var_dump($cnn); $cnn->connect(); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; ?> --EXPECTF-- object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5671) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> string(%d) "%s/testca/cacert.pem" ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } connected object(AMQPConnection)#2 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5671) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> string(%d) "%s/testca/cacert.pem" ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } connected amqp-2.1.2/tests/amqpconnection_tls_mtls.phpt0000644000076500000240000000721114553444052021226 0ustar lstrojnystaff--TEST-- AMQPConnection - TLS - mTLS support --SKIPIF-- --FILE-- 5671, 'host' => getenv('PHP_AMQP_SSL_HOST'), 'cacert' => __DIR__ . "/../infra/tls/certificates/testca/cacert.pem", 'cert' => __DIR__ . "/../infra/tls/certificates/client/cert.pem", 'key' => __DIR__ . "/../infra/tls/certificates/client/key.pem", ); $cnn = new AMQPConnection($credentials); var_dump($cnn); $cnn->connect(); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; echo PHP_EOL; $cnn = new AMQPConnection(); $cnn->setPort(5671); $cnn->setHost(getenv('PHP_AMQP_SSL_HOST')); $cnn->setCACert(__DIR__ . "/../infra/tls/certificates/testca/cacert.pem"); $cnn->setCert(__DIR__ . "/../infra/tls/certificates/client/cert.pem"); $cnn->setKey(__DIR__ . "/../infra/tls/certificates/client/key.pem"); var_dump($cnn); $cnn->connect(); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; ?> --EXPECTF-- object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5671) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> string(%d) "%s/testca/cacert.pem" ["key":"AMQPConnection":private]=> string(%d) "%s/client/key.pem" ["cert":"AMQPConnection":private]=> string(%d) "%s/client/cert.pem" ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } connected object(AMQPConnection)#2 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5671) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> string(%d) "%s/testca/cacert.pem" ["key":"AMQPConnection":private]=> string(%d) "%s/client/key.pem" ["cert":"AMQPConnection":private]=> string(%d) "%s/client/cert.pem" ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } connected amqp-2.1.2/tests/amqpconnection_tls_sasl.phpt0000644000076500000240000000751514553444052021220 0ustar lstrojnystaff--TEST-- AMQPConnection - TLS - SASL authentication --SKIPIF-- --FILE-- getenv('PHP_AMQP_SSL_HOST'), 'port' => 5671, 'cacert' => __DIR__ . "/../infra/tls/certificates/testca/cacert.pem", 'cert' => __DIR__ . "/../infra/tls/certificates/sasl-client/cert.pem", 'key' => __DIR__ . "/../infra/tls/certificates/sasl-client/key.pem", 'sasl_method' => AMQP_SASL_METHOD_EXTERNAL, ); $cnn = new AMQPConnection($credentials); $cnn->setSaslMethod(1); var_dump($cnn); $cnn->connect(); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; echo PHP_EOL; $cnn = new AMQPConnection(); $cnn->setHost(getenv('PHP_AMQP_SSL_HOST')); $cnn->setPort(5671); $cnn->setCACert(__DIR__ . "/../infra/tls/certificates/testca/cacert.pem"); $cnn->setCert(__DIR__ . "/../infra/tls/certificates/sasl-client/cert.pem"); $cnn->setKey(__DIR__ . "/../infra/tls/certificates/sasl-client/key.pem"); $cnn->setSaslMethod(AMQP_SASL_METHOD_EXTERNAL); var_dump($cnn); $cnn->connect(); echo ($cnn->isConnected() ? 'connected' : 'disconnected'), PHP_EOL; ?> --EXPECTF-- object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5671) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> string(%d) "%s/testca/cacert.pem" ["key":"AMQPConnection":private]=> string(%d) "%s/sasl-client/key.pem" ["cert":"AMQPConnection":private]=> string(%d) "%s/sasl-client/cert.pem" ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(1) ["connectionName":"AMQPConnection":private]=> NULL } connected object(AMQPConnection)#2 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5671) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> string(%d) "%s/testca/cacert.pem" ["key":"AMQPConnection":private]=> string(%d) "%s/sasl-client/key.pem" ["cert":"AMQPConnection":private]=> string(%d) "%s/sasl-client/cert.pem" ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(1) ["connectionName":"AMQPConnection":private]=> NULL } connected amqp-2.1.2/tests/amqpconnection_toomanychannels.phpt0000644000076500000240000000154514553444052022573 0ustar lstrojnystaff--TEST-- AMQPConnection too many channels on a connection --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channels = array(); for ($i = 0; $i < PHP_AMQP_MAX_CHANNELS; $i++) { $channel = $channels[] = new AMQPChannel($cnn); //echo '#', $channel->getChannelId(), ', used ', $cnn->getUsedChannels(), ' of ', $cnn->getMaxChannels(), PHP_EOL; } echo "Good\n"; try { new AMQPChannel($cnn); echo "Bad\n"; } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECT-- Good AMQPChannelException(0): Could not create channel. Connection has no open channel slots remaining.amqp-2.1.2/tests/amqpconnection_validation.phpt0000644000076500000240000001201014553444052021510 0ustar lstrojnystaff--TEST-- AMQPConnection parameter validation --SKIPIF-- --FILE-- $value]); echo $getter . " after constructor: "; echo $con1->{$getter}(); echo PHP_EOL; } catch (\Throwable $t) { echo get_class($t); echo ": "; echo $t->getMessage(); echo PHP_EOL; } if ($setter === null) { continue; } $con2 = new AMQPConnection(); try { $con2->{$setter}($value); echo $getter . " after setter: "; echo $con2->{$getter}(); echo PHP_EOL; } catch (\Throwable $t) { echo get_class($t); echo ": "; echo $t->getMessage(); echo PHP_EOL; } } } ?> ==DONE== --EXPECTF-- AMQPConnectionException: Parameter 'login' exceeds 1024 character limit. AMQPConnectionException: Parameter 'login' exceeds 1024 character limit. getLogin after constructor: user getLogin after setter: user AMQPConnectionException: Parameter 'password' exceeds 1024 character limit. AMQPConnectionException: Parameter 'password' exceeds 1024 character limit. getPassword after constructor: pass getPassword after setter: pass AMQPConnectionException: Parameter 'host' exceeds 512 character limit. AMQPConnectionException: Parameter 'host' exceeds 512 character limit. getHost after constructor: host getHost after setter: host AMQPConnectionException: Parameter 'vhost' exceeds 512 character limit. AMQPConnectionException: Parameter 'vhost' exceeds 512 characters limit. getVhost after constructor: vhost getVhost after setter: vhost AMQPConnectionException: Parameter 'port' must be a valid port number between 1 and 65535. AMQPConnectionException: Parameter 'port' must be a valid port number between 1 and 65535. AMQPConnectionException: Parameter 'port' must be a valid port number between 1 and 65535. AMQPConnectionException: Parameter 'port' must be a valid port number between 1 and 65535. getPort after constructor: 1234 getPort after setter: 1234 Deprecated: AMQPConnection::__construct(): Parameter 'timeout' is deprecated; use 'read_timeout' instead in %s on line %d AMQPConnectionException: Parameter 'timeout' must be greater than or equal to zero. Deprecated: AMQPConnection::setTimeout(): AMQPConnection::setTimeout($timeout) method is deprecated; use AMQPConnection::setReadTimeout($timeout) instead in %s on line %d AMQPConnectionException: Parameter 'timeout' must be greater than or equal to zero. AMQPConnectionException: Parameter 'read_timeout' must be greater than or equal to zero. AMQPConnectionException: Parameter 'readTimeout' must be greater than or equal to zero. getReadTimeout after constructor: 20 getReadTimeout after setter: 20 AMQPConnectionException: Parameter 'write_timeout' must be greater than or equal to zero. AMQPConnectionException: Parameter 'writeTimeout' must be greater than or equal to zero. getWriteTimeout after constructor: 30 getWriteTimeout after setter: 30 AMQPConnectionException: Parameter 'connect_timeout' must be greater than or equal to zero. getConnectTimeout after constructor: 40 AMQPConnectionException: Parameter 'rpc_timeout' must be greater than or equal to zero. AMQPConnectionException: Parameter 'rpcTimeout' must be greater than or equal to zero. getRpcTimeout after constructor: 50 getRpcTimeout after setter: 50 AMQPConnectionException: Parameter 'frame_max' is out of range. AMQPConnectionException: Parameter 'frame_max' is out of range. getMaxFrameSize after constructor: 128 AMQPConnectionException: Parameter 'channel_max' is out of range. AMQPConnectionException: Parameter 'channel_max' is out of range. getMaxChannels after constructor: 128 AMQPConnectionException: Parameter 'heartbeat' is out of range. AMQPConnectionException: Parameter 'heartbeat' is out of range. getHeartbeatInterval after constructor: 250 getHeartbeatInterval after constructor: 0 ==DONE==amqp-2.1.2/tests/amqpconnection_var_dump.phpt0000644000076500000240000000702214553444052021202 0ustar lstrojnystaff--TEST-- AMQPConnection var_dump --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); var_dump($cnn->isConnected()); var_dump($cnn); $cnn->connect(); var_dump($cnn->isConnected()); $cnn->connect(); var_dump($cnn->isConnected()); var_dump($cnn); $cnn->disconnect(); var_dump($cnn->isConnected()); var_dump($cnn); ?> --EXPECTF-- bool(false) object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } bool(true) bool(true) object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } bool(false) object(AMQPConnection)#1 (18) { ["login":"AMQPConnection":private]=> string(5) "guest" ["password":"AMQPConnection":private]=> string(5) "guest" ["host":"AMQPConnection":private]=> string(%d) "%s" ["vhost":"AMQPConnection":private]=> string(1) "/" ["port":"AMQPConnection":private]=> int(5672) ["readTimeout":"AMQPConnection":private]=> float(0) ["writeTimeout":"AMQPConnection":private]=> float(0) ["connectTimeout":"AMQPConnection":private]=> float(0) ["rpcTimeout":"AMQPConnection":private]=> float(0) ["frameMax":"AMQPConnection":private]=> int(131072) ["channelMax":"AMQPConnection":private]=> int(256) ["heartbeat":"AMQPConnection":private]=> int(0) ["cacert":"AMQPConnection":private]=> NULL ["key":"AMQPConnection":private]=> NULL ["cert":"AMQPConnection":private]=> NULL ["verify":"AMQPConnection":private]=> bool(true) ["saslMethod":"AMQPConnection":private]=> int(0) ["connectionName":"AMQPConnection":private]=> NULL } amqp-2.1.2/tests/amqpdecimal.phpt0000644000076500000240000000244014553444052016543 0ustar lstrojnystaff--TEST-- AMQPDecimal --SKIPIF-- --FILE-- getExponent(), $decimal->getSignificand()); var_dump($decimal === $decimal->toAmqpValue()); var_dump($decimal instanceof AMQPValue); try { new AMQPDecimal(-1, 1); } catch (AMQPValueException $e) { echo $e->getMessage() . "\n"; } try { new AMQPDecimal(1, -1); } catch (AMQPValueException $e) { echo $e->getMessage() . "\n"; } try { new AMQPDecimal(AMQPDecimal::EXPONENT_MAX+1, 1); } catch (AMQPValueException $e) { echo $e->getMessage() . "\n"; } try { new AMQPDecimal(1, AMQPDecimal::SIGNIFICAND_MAX+1); } catch (AMQPValueException $e) { echo $e->getMessage() . "\n"; } var_dump((new ReflectionClass("AMQPDecimal"))->isFinal()); var_dump(AMQPDecimal::EXPONENT_MIN); var_dump(AMQPDecimal::EXPONENT_MAX); var_dump(AMQPDecimal::SIGNIFICAND_MIN); var_dump(AMQPDecimal::SIGNIFICAND_MAX); ?> ==END== --EXPECT-- int(1) int(2) bool(true) bool(true) Decimal exponent value must be unsigned. Decimal significand value must be unsigned. Decimal exponent value must be less than 255. Decimal significand value must be less than 4294967295. bool(true) int(0) int(255) int(0) int(4294967295) ==END== amqp-2.1.2/tests/amqpenvelope_construct.phpt0000644000076500000240000000244514553444052021073 0ustar lstrojnystaff--TEST-- AMQPEnvelope construct --SKIPIF-- --FILE-- --EXPECT-- object(AMQPEnvelope)#1 (20) { ["contentType":"AMQPBasicProperties":private]=> NULL ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(0) { } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> NULL ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL ["body":"AMQPEnvelope":private]=> string(0) "" ["consumerTag":"AMQPEnvelope":private]=> NULL ["deliveryTag":"AMQPEnvelope":private]=> NULL ["isRedelivery":"AMQPEnvelope":private]=> bool(false) ["exchangeName":"AMQPEnvelope":private]=> NULL ["routingKey":"AMQPEnvelope":private]=> string(0) "" } amqp-2.1.2/tests/amqpenvelope_get_accessors.phpt0000644000076500000240000000607514553444052021676 0ustar lstrojnystaff--TEST-- AMQPEnvelope test get*() accessors --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-'. bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName(), 'routing.*'); // Publish a message to the exchange with a routing key $ex->publish('message', 'routing.1', null, array('headers' => array('foo' => 'bar'))); // Read from the queue $msg = $q->get(null); var_dump($msg); dump_message($msg); $header = $msg->getHeader('foo'); var_dump($header); $header = 'changed'; $header = $msg->getHeader('foo'); var_dump($header); ?> --EXPECTF-- object(AMQPEnvelope)#5 (20) { ["contentType":"AMQPBasicProperties":private]=> string(10) "text/plain" ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(1) { ["foo"]=> string(3) "bar" } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> int(0) ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL ["body":"AMQPEnvelope":private]=> string(7) "message" ["consumerTag":"AMQPEnvelope":private]=> string(0) "" ["deliveryTag":"AMQPEnvelope":private]=> int(1) ["isRedelivery":"AMQPEnvelope":private]=> bool(false) ["exchangeName":"AMQPEnvelope":private]=> string(%d) "exchange-%s" ["routingKey":"AMQPEnvelope":private]=> string(9) "routing.1" } AMQPEnvelope getBody: string(7) "message" getContentType: string(10) "text/plain" getRoutingKey: string(9) "routing.1" getConsumerTag: string(0) "" getDeliveryTag: int(1) getDeliveryMode: int(1) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: NULL getType: NULL getTimeStamp: int(0) getPriority: int(0) getExpiration: NULL getUserId: NULL getAppId: NULL getMessageId: NULL getReplyTo: NULL getCorrelationId: NULL getHeaders: array(1) { ["foo"]=> string(3) "bar" } string(3) "bar" string(3) "bar" amqp-2.1.2/tests/amqpenvelope_var_dump.phpt0000644000076500000240000000662314553444052020666 0ustar lstrojnystaff--TEST-- AMQPEnvelope var_dump --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange1'); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName(), 'routing.*'); // Publish a message to the exchange with a routing key $ex->publish('message', 'routing.1'); $ex->publish('message', 'routing.1', AMQP_NOPARAM, array("headers" => array("test" => "passed"))); // Read from the queue $q->consume("consumeThings"); $q->consume("consumeThings", null); ?> --EXPECTF-- object(AMQPEnvelope)#5 (20) { ["contentType":"AMQPBasicProperties":private]=> string(10) "text/plain" ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(0) { } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> int(0) ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL ["body":"AMQPEnvelope":private]=> string(7) "message" ["consumerTag":"AMQPEnvelope":private]=> string(31) "amq.ctag-%s" ["deliveryTag":"AMQPEnvelope":private]=> int(1) ["isRedelivery":"AMQPEnvelope":private]=> bool(false) ["exchangeName":"AMQPEnvelope":private]=> string(9) "exchange1" ["routingKey":"AMQPEnvelope":private]=> string(9) "routing.1" } object(AMQPEnvelope)#5 (20) { ["contentType":"AMQPBasicProperties":private]=> string(10) "text/plain" ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(1) { ["test"]=> string(6) "passed" } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> int(0) ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL ["body":"AMQPEnvelope":private]=> string(7) "message" ["consumerTag":"AMQPEnvelope":private]=> string(31) "amq.ctag-%s" ["deliveryTag":"AMQPEnvelope":private]=> int(2) ["isRedelivery":"AMQPEnvelope":private]=> bool(false) ["exchangeName":"AMQPEnvelope":private]=> string(9) "exchange1" ["routingKey":"AMQPEnvelope":private]=> string(9) "routing.1" } amqp-2.1.2/tests/amqpexchange-declare-segfault.phpt0000644000076500000240000000156714553444052022145 0ustar lstrojnystaff--TEST-- AMQPExchange --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $name = "exchange-" . bin2hex(random_bytes(32)); $ex = new AMQPExchange(new AMQPChannel($cnn)); $ex->setName($name); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $ex2 = new AMQPExchange(new AMQPChannel($cnn)); $ex2->setName($name); $ex2->setType(AMQP_EX_TYPE_DIRECT); try { $ex2->declareExchange(); } catch (AMQPExchangeException $e) { echo get_class($e) . "\n"; try { $ex2->delete(); } catch (AMQPChannelException $e) { echo get_class($e) . "\n"; } } ?> =DONE= --EXPECT-- AMQPExchangeException AMQPChannelException =DONE=amqp-2.1.2/tests/amqpexchange_attributes.phpt0000644000076500000240000000227114553444052021177 0ustar lstrojnystaff--TEST-- AMQPExchange attributes --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setArguments($arr = array('existent' => 'value', 'false' => false, 'null' => null)); echo 'Initial args: ', count($arr), ', exchange args: ', count($ex->getArguments()), PHP_EOL; $ex->setArgument('foo', 'bar'); echo 'Initial args: ', count($arr), ', exchange args: ', count($ex->getArguments()), PHP_EOL; foreach (array('existent', 'false', 'null', 'nonexistent') as $key) { echo "$key: "; var_export($ex->hasArgument($key)); echo ', '; try { var_export($ex->getArgument($key)); } catch (AMQPExchangeException $e) { echo "Ex: " . $e->getMessage(); } echo PHP_EOL; } ?> --EXPECT-- Initial args: 3, exchange args: 3 Initial args: 3, exchange args: 4 existent: true, 'value' false: true, false null: true, NULL nonexistent: false, Ex: The argument "nonexistent" does not exist amqp-2.1.2/tests/amqpexchange_bind.phpt0000644000076500000240000000146514553444052017731 0ustar lstrojnystaff--TEST-- AMQPExchange::bind --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); var_dump($ex->bind($ex2->getName(), 'test-key-1')); var_dump($ex->bind($ex2->getName(), 'test-key-1')); ?> --EXPECT-- NULL NULLamqp-2.1.2/tests/amqpexchange_bind_with_arguments.phpt0000644000076500000240000000164614553444052023052 0ustar lstrojnystaff--TEST-- AMQPExchange::bind with arguments --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); $time = microtime(true); var_dump($ex->bind($ex2->getName(), 'test', array('test' => 'passed', 'at' => $time))); var_dump($ex->bind($ex2->getName(), 'test', array('test' => 'passed', 'at' => $time))); ?> --EXPECT-- NULL NULLamqp-2.1.2/tests/amqpexchange_bind_without_key.phpt0000644000076500000240000000153214553444052022357 0ustar lstrojnystaff--TEST-- AMQPExchange::bind without key --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); var_dump($ex->bind($ex2->getName())); var_dump($ex->bind($ex2->getName(), null)); var_dump($ex->bind($ex2->getName(), '')); ?> --EXPECT-- NULL NULL NULLamqp-2.1.2/tests/amqpexchange_bind_without_key_with_arguments.phpt0000644000076500000240000000172314553444052025501 0ustar lstrojnystaff--TEST-- AMQPExchange::bind without key with arguments --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); $time = microtime(true); var_dump($ex->bind($ex2->getName(), null, array('test' => 'passed', 'at' => $time, 'i am' => 'first'))); var_dump($ex->bind($ex2->getName(), '', array('test' => 'passed', 'at' => $time, 'i am' => 'second'))); ?> --EXPECT-- NULL NULLamqp-2.1.2/tests/amqpexchange_channel_refcount.phpt0000644000076500000240000000117114553444052022324 0ustar lstrojnystaff--TEST-- AMQPExchange channel refcount --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("refcount-testing"); return $ex; } $ex = buildExchange(); echo $ex->getName() . "\n"; $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $ex->delete(); ?> --EXPECT-- refcount-testing amqp-2.1.2/tests/amqpexchange_construct_basic.phpt0000644000076500000240000000065614553444052022203 0ustar lstrojnystaff--TEST-- AMQPExchange constructor --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); echo get_class($ex); ?> --EXPECT-- AMQPExchangeamqp-2.1.2/tests/amqpexchange_declare_basic.phpt0000644000076500000240000000104014553444052021542 0ustar lstrojnystaff--TEST-- AMQPExchange --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); var_dump($ex->setName("exchange-" . bin2hex(random_bytes(32)))); var_dump($ex->setType(AMQP_EX_TYPE_FANOUT)); var_dump($ex->declareExchange()); ?> --EXPECT-- NULL NULL NULL amqp-2.1.2/tests/amqpexchange_declare_existent.phpt0000644000076500000240000000306514553444052022335 0ustar lstrojnystaff--TEST-- AMQPExchange --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); echo 'Channel id: ', $ch->getChannelId(), PHP_EOL; $exchangge_name = "exchange-" . bin2hex(random_bytes(32)); $ex = new AMQPExchange($ch); $ex->setName($exchangge_name); $ex->setType(AMQP_EX_TYPE_FANOUT); echo "Exchange declared: ", var_export($ex->declareExchange(), true), PHP_EOL; try { $ex = new AMQPExchange($ch); $ex->setName($exchangge_name); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); echo 'exchange ', $ex->getName(), ' declared', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo "Channel connected: ", $ch->isConnected() ? "true" : "false", PHP_EOL; echo "Connection connected: ", $cnn->isConnected() ? "true" : "false", PHP_EOL; try { $ex = new AMQPExchange($ch); echo "New exchange class created", PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECTF-- Channel id: 1 Exchange declared: NULL AMQPExchangeException(406): Server channel error: 406, message: PRECONDITION_FAILED - %s exchange 'exchange-%s' in vhost '/'%s Channel connected: false Connection connected: true AMQPChannelException(0): Could not create exchange. No channel available.amqp-2.1.2/tests/amqpexchange_declare_with_stalled_reference.phpt0000644000076500000240000000153014553444052025166 0ustar lstrojnystaff--TEST-- AMQPExchange - declare with stalled reference --SKIPIF-- --FILE-- declareExchange(); } catch (\Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECT-- AMQPChannelException(0): Could not declare exchange. Stale reference to the channel object. amqp-2.1.2/tests/amqpexchange_declare_without_name.phpt0000644000076500000240000000131714553444052023173 0ustar lstrojnystaff--TEST-- AMQPExchange::declareExchange() without name set --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setType(AMQP_EX_TYPE_FANOUT); try { $ex->declareExchange(); echo 'Exchange declared', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECTF-- AMQPExchangeException(0): Could not declare exchange. Exchanges must have a name. amqp-2.1.2/tests/amqpexchange_declare_without_type.phpt0000644000076500000240000000140614553444053023234 0ustar lstrojnystaff--TEST-- AMQPExchange::declareExchange() without type set --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $exchangge_name = "exchange-" . bin2hex(random_bytes(32)); $ex = new AMQPExchange($ch); $ex->setName($exchangge_name); try { $ex->declareExchange(); echo 'Exchange declared', PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECTF-- AMQPExchangeException(0): Could not declare exchange. Exchanges must have a type. amqp-2.1.2/tests/amqpexchange_delete_default_exchange.phpt0000644000076500000240000000170714553444053023625 0ustar lstrojnystaff--TEST-- AMQPExchange::delete() --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); echo 'Channel id: ', $ch->getChannelId(), PHP_EOL; $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); try { $ex->delete(); } catch (AMQPExchangeException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo "Channel connected: ", $ch->isConnected() ? "true" : "false", PHP_EOL; echo "Connection connected: ", $cnn->isConnected() ? "true" : "false", PHP_EOL; ?> --EXPECT-- Channel id: 1 AMQPExchangeException(403): Server channel error: 403, message: ACCESS_REFUSED - operation not permitted on the default exchange Channel connected: false Connection connected: true amqp-2.1.2/tests/amqpexchange_delete_null_name.phpt0000644000076500000240000000136214553444053022306 0ustar lstrojnystaff--TEST-- AMQPExchange::delete with explicit null as exchange name --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $chan = new AMQPChannel($cnn); $ex = new AMQPExchange($chan); $ex->setName('test.queue.' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $ex->delete(null, null); // Deleting with explicit null deleted the current exchange, so we should be able to redeclare $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declare(); $ex->delete(); ?> ==DONE== --EXPECT-- ==DONE== amqp-2.1.2/tests/amqpexchange_get_channel.phpt0000644000076500000240000000141114553444053021254 0ustar lstrojnystaff--TEST-- AMQPExchange getChannel() test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch2 = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); echo $ch === $ex->getChannel() ? 'same' : 'not same', PHP_EOL; echo $ch2 === $ex->getChannel() ? 'same' : 'not same', PHP_EOL; $old_prefetch = $ch->getPrefetchCount(); $new_prefetch = 999; $ex->getChannel()->setPrefetchCount($new_prefetch); echo $ch->getPrefetchCount() == $new_prefetch ? 'by ref' : 'copy', PHP_EOL; ?> --EXPECT-- same not same by ref amqp-2.1.2/tests/amqpexchange_get_connection.phpt0000644000076500000240000000135714553444053022014 0ustar lstrojnystaff--TEST-- AMQPExchange getConnection test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $cnn2 = new AMQPConnection(); echo $cnn === $ex->getConnection() ? 'same' : 'not same', PHP_EOL; echo $cnn2 === $ex->getConnection() ? 'same' : 'not same', PHP_EOL; $old_host = $cnn->getHost(); $new_host = 'test'; $ex->getConnection()->setHost($new_host); echo $cnn->getHost() == $new_host ? 'by ref' : 'copy', PHP_EOL; ?> --EXPECT-- same not same by ref amqp-2.1.2/tests/amqpexchange_invalid_type.phpt0000644000076500000240000000217414553444053021503 0ustar lstrojnystaff--TEST-- AMQPExchange --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType("invalid_exchange_type"); echo "Channel ", $ch->isConnected() ? 'connected' : 'disconnected', PHP_EOL; echo "Connection ", $cnn->isConnected() ? 'connected' : 'disconnected', PHP_EOL; try { $ex->declareExchange(); } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo "Channel ", $ch->isConnected() ? 'connected' : 'disconnected', PHP_EOL; echo "Connection ", $cnn->isConnected() ? 'connected' : 'disconnected', PHP_EOL; ?> --EXPECT-- Channel connected Connection connected AMQPConnectionException(503): Server connection error: 503, message: COMMAND_INVALID - unknown exchange type 'invalid_exchange_type' Channel disconnected Connection disconnectedamqp-2.1.2/tests/amqpexchange_name.phpt0000644000076500000240000000116114553444053017727 0ustar lstrojnystaff--TEST-- AMQPExchange getConnection test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); var_dump($ex->getName()); $ex->setName('exchange'); var_dump($ex->getName()); $ex->setName(''); var_dump($ex->getName()); $ex->setName(null); var_dump($ex->getName()); ?> ==DONE== --EXPECT-- NULL string(8) "exchange" NULL NULL ==DONE==amqp-2.1.2/tests/amqpexchange_publish_basic.phpt0000644000076500000240000000107114553444053021616 0ustar lstrojnystaff--TEST-- AMQPExchange --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); var_dump($ex->publish('message', 'routing.key')); $ex->delete(); ?> --EXPECT-- NULL amqp-2.1.2/tests/amqpexchange_publish_confirms.phpt0000644000076500000240000000702214553444053022357 0ustar lstrojnystaff--TEST-- AMQPExchange::publish() - publish with confirms --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); //$cnn->setReadTimeout(2); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->confirmSelect(); try { $ch->waitForConfirm(1); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } $ex1 = new AMQPExchange($ch); $ex1->setName("exchange-" . bin2hex(random_bytes(32))); $ex1->setType(AMQP_EX_TYPE_FANOUT); $ex1->setFlags(AMQP_AUTODELETE); $ex1->declareExchange(); var_dump($ex1->publish('message 1', 'routing.key')); var_dump($ex1->publish('message 1', 'routing.key', AMQP_MANDATORY)); try { $ch->waitForConfirm(); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } try { $ch->waitForConfirm(); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } try { $ch->waitForConfirm(1); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } var_dump($ex1->publish('message 1', 'routing.key')); var_dump($ex1->publish('message 1', 'routing.key', AMQP_MANDATORY)); // ack_callback(int $delivery_tag, bool $multiple) : bool; // nack_callback(int $delivery_tag, bool $multiple, bool $requeue) : bool; // return_callback(int $reply_code, string $reply_text, string $exchange, string $routing_key, AMQPBasicProperties $properties, string $body); $ch->setReturnCallback(function ($reply_code, $reply_text, $exchange, $routing_key, AMQPBasicProperties $properties, $body) { echo 'Message returned: ', $reply_text, ', message body:', $body, PHP_EOL; }); $cnt = 2; $ch->setConfirmCallback(function ($delivery_tag, $multiple) use(&$cnt) { echo 'Message acked', PHP_EOL; var_dump(func_get_args()); return --$cnt > 0; }, function ($delivery_tag, $multiple, $requeue) { echo 'Message nacked', PHP_EOL; var_dump(func_get_args()); return false; }); try { $ch->waitForConfirm(); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } $ex1->delete(); $ex2 = new AMQPExchange($ch); $ex2->setName("exchange-nonexistent-" . bin2hex(random_bytes(32))); var_dump($ex2->publish('message 2', 'routing.key')); try { $ch->waitForConfirm(1); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } ?> --EXPECTF-- AMQPQueueException(0): Wait timeout exceed NULL NULL Unhandled basic.ack method from server received. Use AMQPChannel::setConfirmCallback() to process it. Unhandled basic.return method from server received. Use AMQPChannel::setReturnCallback() to process it. Unhandled basic.ack method from server received. Use AMQPChannel::setConfirmCallback() to process it. NULL NULL Message acked array(2) { [0]=> int(3) [1]=> bool(false) } Message returned: NO_ROUTE, message body:message 1 Message acked array(2) { [0]=> int(4) [1]=> bool(false) } NULL AMQPChannelException(404): Server channel error: 404, message: NOT_FOUND - no exchange 'exchange-nonexistent-%s' in vhost '/' amqp-2.1.2/tests/amqpexchange_publish_confirms_consume.phpt0000644000076500000240000000545114553444053024114 0ustar lstrojnystaff--TEST-- AMQPExchange::publish() - publish in conform mode and handle conforms with AMQPQueue::consume() method --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(2); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch->confirmSelect(); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->setFlags(AMQP_AUTODELETE); $ex->declareExchange(); var_dump($ex->publish('message 1', 'routing.key', AMQP_MANDATORY)); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $msg = $q->get(); var_dump($msg); try { $q->consume(function() use ($q) { echo 'Message returned', PHP_EOL; var_dump(func_get_args()); return false; }); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } var_dump($ex->publish('message 2', 'routing.key', AMQP_MANDATORY)); /* callback(int $reply_code, string $reply_text, string $exchange, string $routing_key, AMQPBasicProperties $properties, string $body); */ $ch->setReturnCallback(function ($reply_code, $reply_text, $exchange, $routing_key, AMQPBasicProperties $properties, $body) { echo 'Message returned: ', $reply_text, ', message body:', $body, PHP_EOL; }); $cnt = 1; $ch->setConfirmCallback(function ($delivery_tag, $multiple) use(&$cnt) { echo 'Message acked', PHP_EOL; var_dump(func_get_args()); return --$cnt > 0; }, function ($delivery_tag, $multiple, $requeue) { echo 'Message nacked', PHP_EOL; var_dump(func_get_args()); return false; }); try { $q->consume(function() use ($q) { echo 'Received message', PHP_EOL; var_dump(func_get_args()); return false; }); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } $q->delete(); $ex->delete(); ?> --EXPECT-- NULL NULL Unhandled basic.return method from server received. Use AMQPChannel::setReturnCallback() to process it. Unhandled basic.ack method from server received. Use AMQPChannel::setConfirmCallback() to process it. AMQPQueueException(0): Consumer timeout exceed NULL Message returned: NO_ROUTE, message body:message 2 Message acked array(2) { [0]=> int(2) [1]=> bool(false) } AMQPQueueException(0): Consumer timeout exceed amqp-2.1.2/tests/amqpexchange_publish_empty_routing_key.phpt0000644000076500000240000000111114553444053024305 0ustar lstrojnystaff--TEST-- AMQPExchange publish with empty routing key --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); var_dump($ex->publish('message')); $ex->delete(); ?> --EXPECT-- NULL amqp-2.1.2/tests/amqpexchange_publish_mandatory.phpt0000644000076500000240000000627114553444053022542 0ustar lstrojnystaff--TEST-- AMQPExchange::publish() - publish unroutable mandatory --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); //$cnn->setReadTimeout(2); $cnn->connect(); $ch = new AMQPChannel($cnn); try { $ch->waitForBasicReturn(1); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->setFlags(AMQP_AUTODELETE); $ex->declareExchange(); var_dump($ex->publish('message 1', 'routing.key', AMQP_MANDATORY)); var_dump($ex->publish('message 2', 'routing.key', AMQP_MANDATORY)); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $msg = $q->get(); var_dump($msg); try { $ch->waitForBasicReturn(); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } /* callback(int $reply_code, string $reply_text, string $exchange, string $routing_key, AMQPBasicProperties $properties, string $body); */ $ch->setReturnCallback(function ($reply_code, $reply_text, $exchange, $routing_key, AMQPBasicProperties $properties, $body) { echo 'Message returned', PHP_EOL; var_dump(func_get_args()); return false; }); try { $ch->waitForBasicReturn(); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } $q->delete(); $ex->delete(); ?> --EXPECTF-- AMQPQueueException(0): Wait timeout exceed NULL NULL NULL Unhandled basic.return method from server received. Use AMQPChannel::setReturnCallback() to process it. Message returned array(6) { [0]=> int(312) [1]=> string(8) "NO_ROUTE" [2]=> string(%d) "exchange-%s" [3]=> string(11) "routing.key" [4]=> object(AMQPBasicProperties)#7 (14) { ["contentType":"AMQPBasicProperties":private]=> string(10) "text/plain" ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(0) { } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> int(0) ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL } [5]=> string(9) "message 2" } amqp-2.1.2/tests/amqpexchange_publish_mandatory_consume.phpt0000644000076500000240000000651314553444053024272 0ustar lstrojnystaff--TEST-- AMQPExchange::publish() - publish unroutable with mandatory flag and handle them with AMQPQueue::consume() method --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(2); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->setFlags(AMQP_AUTODELETE); $ex->declareExchange(); var_dump($ex->publish('message 1', 'routing.key', AMQP_MANDATORY)); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $msg = $q->get(); var_dump($msg); try { $q->consume(function() use ($q) { echo 'Message returned', PHP_EOL; var_dump(func_get_args()); return false; }); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } var_dump($ex->publish('message 2', 'routing.key', AMQP_MANDATORY)); /* callback(int $reply_code, string $reply_text, string $exchange, string $routing_key, AMQPBasicProperties $properties, string $body); */ $ch->setReturnCallback(function ($reply_code, $reply_text, $exchange, $routing_key, AMQPBasicProperties $properties, $body) { echo 'Message returned', PHP_EOL; var_dump(func_get_args()); }); try { $q->consume(function() use ($q) { echo 'Received message', PHP_EOL; var_dump(func_get_args()); return false; }); } catch(Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(). PHP_EOL; } $q->delete(); $ex->delete(); ?> --EXPECTF-- NULL NULL Unhandled basic.return method from server received. Use AMQPChannel::setReturnCallback() to process it. AMQPQueueException(0): Consumer timeout exceed NULL Message returned array(6) { [0]=> int(312) [1]=> string(8) "NO_ROUTE" [2]=> string(%d) "exchange-%s" [3]=> string(11) "routing.key" [4]=> object(AMQPBasicProperties)#9 (14) { ["contentType":"AMQPBasicProperties":private]=> string(10) "text/plain" ["contentEncoding":"AMQPBasicProperties":private]=> NULL ["headers":"AMQPBasicProperties":private]=> array(0) { } ["deliveryMode":"AMQPBasicProperties":private]=> int(1) ["priority":"AMQPBasicProperties":private]=> int(0) ["correlationId":"AMQPBasicProperties":private]=> NULL ["replyTo":"AMQPBasicProperties":private]=> NULL ["expiration":"AMQPBasicProperties":private]=> NULL ["messageId":"AMQPBasicProperties":private]=> NULL ["timestamp":"AMQPBasicProperties":private]=> int(0) ["type":"AMQPBasicProperties":private]=> NULL ["userId":"AMQPBasicProperties":private]=> NULL ["appId":"AMQPBasicProperties":private]=> NULL ["clusterId":"AMQPBasicProperties":private]=> NULL } [5]=> string(9) "message 2" } AMQPQueueException(0): Consumer timeout exceed amqp-2.1.2/tests/amqpexchange_publish_mandatory_multiple_channels_pitfall.phpt0000644000076500000240000000413614553444053030041 0ustar lstrojnystaff--TEST-- AMQPExchange::publish() - publish unroutable mandatory on multiple channels pitfall --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch1 = new AMQPChannel($cnn); try { $ch1->waitForBasicReturn(1); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage() . PHP_EOL; } $ch2 = new AMQPChannel($cnn); try { $ch2->waitForBasicReturn(1); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage() . PHP_EOL; } $exchange_name = "exchange-" . bin2hex(random_bytes(32)); $ex1 = new AMQPExchange($ch1); $ex1->setName($exchange_name); $ex1->setType(AMQP_EX_TYPE_FANOUT); $ex1->setFlags(AMQP_AUTODELETE); $ex1->declareExchange(); $ex2 = new AMQPExchange($ch2); $ex2->setName($exchange_name); var_dump($ex2->publish('message 1-2', 'routing.key', AMQP_MANDATORY)); var_dump($ex2->publish('message 2-2', 'routing.key', AMQP_MANDATORY)); // Create a new queue $q = new AMQPQueue($ch1); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $msg = $q->get(); var_dump($msg); try { $ch1->waitForBasicReturn(); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } // This error happens because on a channel 1 we are expecting only messages withing channel 1, but inside current // connection we already have pending message on channel 2 echo 'Connection active: ', ($cnn->isConnected() ? 'yes' : 'no'); ?> --EXPECTF-- AMQPQueueException(0): Wait timeout exceed AMQPQueueException(0): Wait timeout exceed NULL NULL NULL AMQPException(0): unexpected method received Connection active: no amqp-2.1.2/tests/amqpexchange_publish_null_routing_key.phpt0000644000076500000240000000111614553444053024126 0ustar lstrojnystaff--TEST-- AMQPExchange publish with null routing key --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); var_dump($ex->publish('message', null)); $ex->delete(); ?> --EXPECT-- NULL amqp-2.1.2/tests/amqpexchange_publish_with_decimal_header.phpt0000644000076500000240000000245314553444053024503 0ustar lstrojnystaff--TEST-- AMQPExchange publish with decimal header --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName()); $headers = ['headerName' => new AMQPDecimal(123, 456)]; $ex->publish('message', 'routing.key', AMQP_NOPARAM, array('headers' => $headers)); $message =$q->get(AMQP_AUTOACK); var_dump($message->getHeaders()); var_dump($headers); echo $message->getHeaders() == $headers ? 'same' : 'differs'; ?> ==DONE== --EXPECTF-- array(1) { ["headerName"]=> object(AMQPDecimal)#7 (2) { ["exponent":"AMQPDecimal":private]=> int(123) ["significand":"AMQPDecimal":private]=> int(456) } } array(1) { ["headerName"]=> object(AMQPDecimal)#5 (2) { ["exponent":"AMQPDecimal":private]=> int(123) ["significand":"AMQPDecimal":private]=> int(456) } } same ==DONE== amqp-2.1.2/tests/amqpexchange_publish_with_null.phpt0000644000076500000240000000423114553444053022543 0ustar lstrojnystaff--TEST-- AMQPExchange::publish() body with null-byte --SKIPIF-- --FILE-- bar = $bar; $this->baz = $baz; } } $cnn = new AMQPConnection(array('read_timeout' => 5)); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $q_name = 'test_' . bin2hex(random_bytes(32)); $q = new AMQPQueue($channel); $q->setName($q_name); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); $ex = new AMQPExchange($channel); $orig1= new Foo('x1', 'y1'); $orig2= new Foo('x2', 'y2'); $s1 = serialize($orig1); $s2 = serialize($orig2); echo 'Orig 1:', PHP_EOL; var_dump($orig1); var_dump($s1); echo PHP_EOL; echo 'Orig 2:', PHP_EOL; var_dump($orig2); var_dump($s2); echo PHP_EOL; $ex->publish($s1, $q_name); $ex->publish($s2, $q_name); echo 'basic.get:', PHP_EOL; $msg = $q->get(); var_dump($msg->getBody()); $restored = unserialize($msg->getBody()); var_dump($restored); echo PHP_EOL; $q->consume(function ($msg) { echo 'basic.consume:', PHP_EOL; var_dump($msg->getBody()); $restored = unserialize($msg->getBody()); var_dump($restored); return false; }); ?> --EXPECT-- Orig 1: object(Foo)#5 (2) { ["bar":"Foo":private]=> string(2) "x1" ["baz":protected]=> string(2) "y1" } string(60) "O:3:"Foo":2:{s:8:"Foobar";s:2:"x1";s:6:"*baz";s:2:"y1";}" Orig 2: object(Foo)#6 (2) { ["bar":"Foo":private]=> string(2) "x2" ["baz":protected]=> string(2) "y2" } string(60) "O:3:"Foo":2:{s:8:"Foobar";s:2:"x2";s:6:"*baz";s:2:"y2";}" basic.get: string(60) "O:3:"Foo":2:{s:8:"Foobar";s:2:"x1";s:6:"*baz";s:2:"y1";}" object(Foo)#8 (2) { ["bar":"Foo":private]=> string(2) "x1" ["baz":protected]=> string(2) "y1" } basic.consume: string(60) "O:3:"Foo":2:{s:8:"Foobar";s:2:"x2";s:6:"*baz";s:2:"y2";}" object(Foo)#11 (2) { ["bar":"Foo":private]=> string(2) "x2" ["baz":protected]=> string(2) "y2" } amqp-2.1.2/tests/amqpexchange_publish_with_properties.phpt0000644000076500000240000000750414553444053023773 0ustar lstrojnystaff--TEST-- AMQPExchange publish with properties --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->declareQueue(); $q->bind($ex->getName()); $attrs = array( 'content_type' => 1, // should be string 'content_encoding' => 2, // should be string 'message_id' => 3, // should be string //'user_id' => 4, // should be string // NOTE: fail due to Validated User-ID https://www.rabbitmq.com/validated-user-id.html, @see tests/amqpexchange_publish_with_properties_user_id_failure.phpt test 'app_id' => 5, // should be string 'delivery_mode' => '1-non-persistent', // should be long 'priority' => '2high', // should be long 'timestamp' => '123now', // should be long 'expiration' => 100000000, // should be string // NOTE: in fact it is milliseconds for how long to stay in queue, see https://www.rabbitmq.com/ttl.html#per-message-ttl for details 'type' => 7, // should be string 'reply_to' => 8, // should be string 'correlation_id' => 9, // should be string //'headers' => 'not array', // should be array // NOTE: covered in tests/amqpexchange_publish_with_properties_ignore_num_header.phpt ); $attrs_control = array( 'content_type' => 1, // should be string 'content_encoding' => 2, // should be string 'message_id' => 3, // should be string //'user_id' => 4, // should be string // NOTE: fail due to Validated User-ID https://www.rabbitmq.com/validated-user-id.html, @see tests/amqpexchange_publish_with_properties_user_id_failure.phpt test 'app_id' => 5, // should be string 'delivery_mode' => '1-non-persistent', // should be long 'priority' => '2high', // should be long 'timestamp' => '123now', // should be long 'expiration' => 100000000, // should be string // NOTE: in fact it is milliseconds for how long to stay in queue, see https://www.rabbitmq.com/ttl.html#per-message-ttl for details 'type' => 7, // should be string 'reply_to' => 8, // should be string 'correlation_id' => 9, // should be string //'headers' => 'not array', // should be array // NOTE: covered in tests/amqpexchange_publish_with_properties_ignore_num_header.phpt ); var_dump($ex->publish('message', 'routing.key', AMQP_NOPARAM, $attrs)); //var_dump($attrs, $attrs_control); echo 'Message attributes are ', $attrs === $attrs_control ? 'the same' : 'not the same', PHP_EOL; $msg = $q->get(AMQP_AUTOACK); dump_message($msg); $ex->delete(); $q->delete(); ?> --EXPECTF-- NULL Message attributes are the same AMQPEnvelope getBody: string(7) "message" getContentType: string(1) "1" getRoutingKey: string(11) "routing.key" getConsumerTag: string(0) "" getDeliveryTag: int(1) getDeliveryMode: int(1) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: string(1) "2" getType: string(1) "7" getTimeStamp: int(123) getPriority: int(2) getExpiration: string(9) "100000000" getUserId: NULL getAppId: string(1) "5" getMessageId: string(1) "3" getReplyTo: string(1) "8" getCorrelationId: string(1) "9" getHeaders: array(0) { } amqp-2.1.2/tests/amqpexchange_publish_with_properties_ignore_num_header.phpt0000644000076500000240000000171014553444053027516 0ustar lstrojnystaff--TEST-- AMQPExchange publish with properties - ignore numeric keys in headers --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); var_dump($ex->publish('message', 'routing.key', AMQP_NOPARAM, array('headers' => 'ignored'))); var_dump($ex->publish('message', 'routing.key', AMQP_NOPARAM, array('headers' => array(2 => 'ignore_me')))); $ex->delete(); ?> --EXPECTF-- Warning: AMQPExchange::publish(): Ignoring non-string header field '0' in %s on line %d NULL Warning: AMQPExchange::publish(): Ignoring non-string header field '2' in %s on line %d NULL amqp-2.1.2/tests/amqpexchange_publish_with_properties_ignore_unsupported_header_values.phpt0000644000076500000240000000206314553444053032670 0ustar lstrojnystaff--TEST-- AMQPExchange publish with properties - ignore unsupported header values (NULL, object, resources) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $attrs = array( 'headers' => array( 'null' => null, 'object' => new stdClass(), 'resource' => fopen(__FILE__, 'r'), ), ); var_dump($ex->publish('message', 'routing.key', AMQP_NOPARAM, $attrs)); $ex->delete(); ?> --EXPECTF-- Warning: AMQPExchange::publish(): Ignoring field 'object' due to unsupported value type (object) in %s on line %d Warning: AMQPExchange::publish(): Ignoring field 'resource' due to unsupported value type (resource) in %s on line %d NULL amqp-2.1.2/tests/amqpexchange_publish_with_properties_nested_header.phpt0000644000076500000240000000555614553444053026652 0ustar lstrojnystaff--TEST-- AMQPExchange publish with properties - nested header values --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName()); $headers = array( 'nested' => array( 'string' => 'passed', 999 => 'numeric works', 'sub-nested' => array( 'should' => 'works', 42 => 'too' ), ), ); $ex->publish('message', 'routing.key', AMQP_NOPARAM, array('headers' => $headers)); $message = $q->get(AMQP_AUTOACK); var_dump($message->getHeaders()); var_dump($headers); echo $message->getHeaders() === $headers ? 'same' : 'differs'; echo PHP_EOL, PHP_EOL; $headers = array( 'x-death' => array( array ( 'reason' => 'rejected', 'queue' => 'my_queue', 'time' => 1410527691, 'exchange' => 'my_exchange', 'routing-keys' => array ('my_routing_key') ) ) ); $ex->publish('message', 'routing.key', AMQP_NOPARAM, array('headers' => $headers)); $message = $q->get(AMQP_AUTOACK); var_dump($message->getHeaders()); var_dump($headers); echo $message->getHeaders() === $headers ? 'same' : 'differs'; echo PHP_EOL, PHP_EOL; ?> --EXPECT-- array(1) { ["nested"]=> array(3) { ["string"]=> string(6) "passed" [999]=> string(13) "numeric works" ["sub-nested"]=> array(2) { ["should"]=> string(5) "works" [42]=> string(3) "too" } } } array(1) { ["nested"]=> array(3) { ["string"]=> string(6) "passed" [999]=> string(13) "numeric works" ["sub-nested"]=> array(2) { ["should"]=> string(5) "works" [42]=> string(3) "too" } } } same array(1) { ["x-death"]=> array(1) { [0]=> array(5) { ["reason"]=> string(8) "rejected" ["queue"]=> string(8) "my_queue" ["time"]=> int(1410527691) ["exchange"]=> string(11) "my_exchange" ["routing-keys"]=> array(1) { [0]=> string(14) "my_routing_key" } } } } array(1) { ["x-death"]=> array(1) { [0]=> array(5) { ["reason"]=> string(8) "rejected" ["queue"]=> string(8) "my_queue" ["time"]=> int(1410527691) ["exchange"]=> string(11) "my_exchange" ["routing-keys"]=> array(1) { [0]=> string(14) "my_routing_key" } } } } sameamqp-2.1.2/tests/amqpexchange_publish_with_properties_user_id_failure.phpt0000644000076500000240000000367314553444053027217 0ustar lstrojnystaff--TEST-- AMQPExchange publish with properties - user_id failure --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); echo "Channel ", $ch->isConnected() ? 'connected' : 'disconnected', PHP_EOL; echo "Connection ", $cnn->isConnected() ? 'connected' : 'disconnected', PHP_EOL; try { // NOTE: basic.publish is asynchronous, so ... var_dump($ex->publish('message', 'routing.key', AMQP_NOPARAM, array('user_id' => 'unknown-' . bin2hex(random_bytes(32))))); } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo "Channel ", $ch->isConnected() ? 'connected' : 'disconnected', PHP_EOL; echo "Connection ", $cnn->isConnected() ? 'connected' : 'disconnected', PHP_EOL; try { // NOTE: ... the next socket (not only channel) operation will fail, which may lead to very strange issues // if we operate here,on different entity, for example on queue. $q = new AMQPQueue($ch); $q->declareQueue(); echo "Queue declared", PHP_EOL; } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } echo "Channel ", $ch->isConnected() ? 'connected' : 'disconnected', PHP_EOL; echo "Connection ", $cnn->isConnected() ? 'connected' : 'disconnected', PHP_EOL; ?> --EXPECTF-- Channel connected Connection connected NULL Channel connected Connection connected AMQPQueueException(406): Server channel error: 406, message: PRECONDITION_FAILED - user_id property set to 'unknown-%s' but authenticated user was 'guest' Channel disconnected Connection connectedamqp-2.1.2/tests/amqpexchange_publish_with_timestamp_header.phpt0000644000076500000240000000233514553444053025107 0ustar lstrojnystaff--TEST-- AMQPExchange publish with timestamp header --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName()); $headers = ['headerName' => new AMQPTimestamp(1488578462)]; $ex->publish('message', 'routing.key', AMQP_NOPARAM, array('headers' => $headers)); $message =$q->get(AMQP_AUTOACK); var_dump($message->getHeaders()); var_dump($headers); echo $message->getHeaders() == $headers ? 'same' : 'differs'; ?> ==DONE== --EXPECTF-- array(1) { ["headerName"]=> object(AMQPTimestamp)#%d (1) { ["timestamp":"AMQPTimestamp":private]=> float(1488578462) } } array(1) { ["headerName"]=> object(AMQPTimestamp)#%d (1) { ["timestamp":"AMQPTimestamp":private]=> float(1488578462) } } same ==DONE== amqp-2.1.2/tests/amqpexchange_publish_xdeath.phpt0000644000076500000240000001111014553444053022005 0ustar lstrojnystaff--TEST-- AMQPExchange publish with properties - nested header values --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $suffix = sha1(microtime(true)); $dlx = new AMQPExchange($ch); $dlx->setName('dlx-' . $suffix); $dlx->setType(AMQP_EX_TYPE_TOPIC); $dlx->setFlags(AMQP_DURABLE); $dlx->declareExchange(); $dq = new AMQPQueue($ch); $dq->setName('dlx-' . $suffix); $dq->declareQueue(); $dq->setFlags(AMQP_DURABLE); $dq->bind($dlx->getName(), '#'); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . $suffix); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->setFlags(AMQP_DURABLE); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('dlx-test-queue-' . $suffix); $q->setFlags(AMQP_DURABLE); $q->setArgument('x-dead-letter-exchange', $dlx->getName()); $q->declareQueue(); $q->bind($ex->getName()); $ex->publish('message'); function assert_xdeath(AMQPEnvelope $envelope, $exchangeName, $queueName) { if (!$envelope->hasHeader('x-death')) { return 'header-missing'; } $originalHeader = $envelope->getHeader('x-death'); /** * RabbitMQ 3.5.1 handles x-death headers differently: instead of growing the table x-death * headers indefinitely it introduces a count field indexed by queue and reason. We normalize * the headers to match the new format and to test against that * * https://github.com/rabbitmq/rabbitmq-server/releases/tag/rabbitmq_v3_5_1 * https://github.com/rabbitmq/rabbitmq-server/issues/78 * https://github.com/rabbitmq/rabbitmq-server/pull/79 */ $header = []; foreach ($originalHeader as $death) { $index = $death['queue'] . $death['reason']; $count = isset($death['count']) ? $death['count'] : 1; if (!isset($header[$index])) { $header[$index] = array_merge($death, ['count' => $count]); } else { $header[$index]['count'] += $count; } } $header = array_values($header); if (count($header) !== 1) { return 'unexpected-number-of-headers-' . count($header) . ': ' . json_encode($header); } if (!isset($header[0]['reason']) || $header[0]['reason'] !== 'rejected') { return 'unexpected-reason: ' . json_encode($header); } if (!isset($header[0]['time']) || !$header[0]['time'] instanceof AMQPTimestamp || $header[0]['time']->getTimestamp() < 1690465578) { return 'unexpected-time: ' . json_encode($header); } if (!isset($header[0]['exchange']) || $header[0]['exchange'] !== $exchangeName) { return 'unexpected-exchange: ' . json_encode($header); } if (!isset($header[0]['queue']) || $header[0]['queue'] !== $queueName) { return 'unexpected-queue: ' . json_encode($header); } if (!isset($header[0]['routing-keys']) || $header[0]['routing-keys'] !== ['']) { return 'unexpected-routing-keys: ' . json_encode($header); } if (!isset($header[0]['count'])) { return 'count-missing: ' . json_encode($header); } return $header[0]['count']; } $envelope = $q->get(); var_dump(assert_xdeath($envelope, $ex->getName(), $q->getName())); $q->nack($envelope->getDeliveryTag()); usleep(20000); $failed = $dq->get(); var_dump(assert_xdeath($failed, $ex->getName(), $q->getName())); $dq->ack($failed->getDeliveryTag()); $ex->publish( $failed->getBody(), $failed->getRoutingKey(), AMQP_NOPARAM, [ 'content_type' => $failed->getContentType(), 'content_encoding' => $failed->getContentEncoding(), 'message_id' => $failed->getMessageId(), 'user_id' => $failed->getUserId(), 'app_id' => $failed->getAppId(), 'delivery_mode' => $failed->getDeliveryMode(), 'priority' => $failed->getPriority(), 'timestamp' => $failed->getTimeStamp(), 'expiration' => $failed->getExpiration(), 'type' => $failed->getType(), 'reply_to' => $failed->getReplyTo(), 'headers' => $failed->getHeaders(), 'correlation_id' => $failed->getCorrelationId(), ] ); usleep(20000); $envelope = $q->get(); var_dump(assert_xdeath($envelope, $ex->getName(), $q->getName())); $q->nack($envelope->getDeliveryTag()); usleep(20000); $failedTwice = $dq->get(); var_dump(assert_xdeath($failedTwice, $ex->getName(), $q->getName())); $dq->ack($failedTwice->getDeliveryTag()); ?> ==DONE== --EXPECTF-- string(14) "header-missing" int(1) int(1) int(2) ==DONE==amqp-2.1.2/tests/amqpexchange_setArgument.phpt0000644000076500000240000000666614553444053021324 0ustar lstrojnystaff--TEST-- AMQPExchange::setArgument() test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $heartbeat = 10; $e_name_ae = 'test.exchange.ae.' . bin2hex(random_bytes(32)); $e_name = 'test.exchange.' . bin2hex(random_bytes(32)); $ex_ae = new AMQPExchange($ch); $ex_ae->setName($e_name_ae); $ex_ae->setFlags(AMQP_AUTODELETE); $ex_ae->setType(AMQP_EX_TYPE_FANOUT); $ex_ae->declareExchange(); var_dump($ex_ae); $ex = new AMQPExchange($ch); $ex->setName($e_name); $ex->setFlags(AMQP_AUTODELETE); $ex->setType(AMQP_EX_TYPE_FANOUT); // some real keys $ex->setArgument("x-ha-policy", "all"); $ex->setArgument("alternate-exchange", $e_name_ae); // some custom keys to test various cases $ex->setArgument('x-empty-string', ''); $ex->setArgument('x-alternate-exchange-one-more-time', $e_name_ae); $ex->setArgument('x-numeric-argument', $heartbeat * 10 * 1000); $ex->setArgument('x-null-argument', null); $ex->declareExchange(); var_dump($ex); $ex->removeArgument('x-null-argument'); $ex->removeArgument('x-does-not-exist'); var_dump($ex); ?> --EXPECTF-- object(AMQPExchange)#3 (9) { ["connection":"AMQPExchange":private]=> %a ["channel":"AMQPExchange":private]=> %a ["name":"AMQPExchange":private]=> string(%d) "test.exchange.ae.%s" ["type":"AMQPExchange":private]=> string(6) "fanout" ["passive":"AMQPExchange":private]=> bool(false) ["durable":"AMQPExchange":private]=> bool(false) ["autoDelete":"AMQPExchange":private]=> bool(true) ["internal":"AMQPExchange":private]=> bool(false) ["arguments":"AMQPExchange":private]=> array(0) { } } object(AMQPExchange)#4 (9) { ["connection":"AMQPExchange":private]=> %a ["channel":"AMQPExchange":private]=> %a ["name":"AMQPExchange":private]=> string(%d) "test.exchange.%s" ["type":"AMQPExchange":private]=> string(6) "fanout" ["passive":"AMQPExchange":private]=> bool(false) ["durable":"AMQPExchange":private]=> bool(false) ["autoDelete":"AMQPExchange":private]=> bool(true) ["internal":"AMQPExchange":private]=> bool(false) ["arguments":"AMQPExchange":private]=> array(6) { ["x-ha-policy"]=> string(3) "all" ["alternate-exchange"]=> string(%d) "test.exchange.ae.%s" ["x-empty-string"]=> string(0) "" ["x-alternate-exchange-one-more-time"]=> string(%d) "test.exchange.ae.%s" ["x-numeric-argument"]=> int(100000) ["x-null-argument"]=> NULL } } object(AMQPExchange)#4 (9) { ["connection":"AMQPExchange":private]=> %a ["channel":"AMQPExchange":private]=> %a ["name":"AMQPExchange":private]=> string(%d) "test.exchange.%s" ["type":"AMQPExchange":private]=> string(6) "fanout" ["passive":"AMQPExchange":private]=> bool(false) ["durable":"AMQPExchange":private]=> bool(false) ["autoDelete":"AMQPExchange":private]=> bool(true) ["internal":"AMQPExchange":private]=> bool(false) ["arguments":"AMQPExchange":private]=> array(5) { ["x-ha-policy"]=> string(3) "all" ["alternate-exchange"]=> string(%d) "test.exchange.ae.%s" ["x-empty-string"]=> string(0) "" ["x-alternate-exchange-one-more-time"]=> string(%d) "test.exchange.ae.%s" ["x-numeric-argument"]=> int(100000) } } amqp-2.1.2/tests/amqpexchange_set_flag.phpt0000644000076500000240000000105414553444053020574 0ustar lstrojnystaff--TEST-- AMQPExchange set flag string --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); echo $ex->getFlags(); $ex->setFlags("2"); echo $ex->getFlags(); $ex->setFlags(NULL); echo $ex->getFlags(); $ex->setFlags(2); echo $ex->getFlags(); ?> --EXPECT-- 0202amqp-2.1.2/tests/amqpexchange_set_flags.phpt0000644000076500000240000000221514553444053020757 0ustar lstrojnystaff--TEST-- AMQPExchange setFlags() --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->setArguments(array("x-ha-policy" => "all")); $ex->setFlags(AMQP_PASSIVE | AMQP_DURABLE | AMQP_AUTODELETE | AMQP_INTERNAL); var_dump($ex); ?> --EXPECTF-- object(AMQPExchange)#3 (9) { ["connection":"AMQPExchange":private]=> %a ["name":"AMQPExchange":private]=> string(%d) "exchange-%s" ["type":"AMQPExchange":private]=> string(6) "fanout" ["passive":"AMQPExchange":private]=> bool(true) ["durable":"AMQPExchange":private]=> bool(true) ["autoDelete":"AMQPExchange":private]=> bool(true) ["internal":"AMQPExchange":private]=> bool(true) ["arguments":"AMQPExchange":private]=> array(1) { ["x-ha-policy"]=> string(3) "all" } } amqp-2.1.2/tests/amqpexchange_type.phpt0000644000076500000240000000131014553444053017764 0ustar lstrojnystaff--TEST-- AMQPExchange getConnection test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); var_dump($ex->getType()); $ex->setType(AMQP_EX_TYPE_FANOUT); var_dump($ex->getType()); $ex->setType(null); var_dump($ex->getType()); $ex->setType(AMQP_EX_TYPE_DIRECT); var_dump($ex->getType()); $ex->setType(""); var_dump($ex->getType()); ?> ==DONE== --EXPECT-- NULL string(6) "fanout" NULL string(6) "direct" NULL ==DONE==amqp-2.1.2/tests/amqpexchange_unbind.phpt0000644000076500000240000000160314553444053020267 0ustar lstrojnystaff--TEST-- AMQPExchange::unbind --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-unbind-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-unbind-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); var_dump($ex->bind($ex2->getName(), 'test-key-1')); var_dump($ex->unbind($ex2->getName(), 'test-key-1')); var_dump($ex->unbind($ex2->getName(), 'test-key-1')); ?> --EXPECT-- NULL NULL NULLamqp-2.1.2/tests/amqpexchange_unbind_with_arguments.phpt0000644000076500000240000000204114553444053023404 0ustar lstrojnystaff--TEST-- AMQPExchange::unbind with arguments --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-unbind-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-exchange-unbind-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); $time = microtime(true); var_dump($ex->bind($ex2->getName(), 'test', array('test' => 'passed', 'at' => $time))); var_dump($ex->unbind($ex2->getName(), 'test', array('test' => 'passed', 'at' => $time))); var_dump($ex->unbind($ex2->getName(), 'test', array('test' => 'passed', 'at' => $time))); ?> --EXPECT-- NULL NULL NULLamqp-2.1.2/tests/amqpexchange_unbind_without_key.phpt0000644000076500000240000000154514553444053022727 0ustar lstrojnystaff--TEST-- AMQPExchange::unbind without key --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-unbind-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-unbind-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); var_dump($ex->bind($ex2->getName())); var_dump($ex->unbind($ex2->getName())); var_dump($ex->unbind($ex2->getName())); ?> --EXPECT-- NULL NULL NULLamqp-2.1.2/tests/amqpexchange_unbind_without_key_with_arguments.phpt0000644000076500000240000000264214553444053026046 0ustar lstrojnystaff--TEST-- AMQPExchange::unbind without key with arguments --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-unbind-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Declare a new exchange $ex2 = new AMQPExchange($ch); $ex2->setName('exchange2-unbind-' . bin2hex(random_bytes(32))); $ex2->setType(AMQP_EX_TYPE_FANOUT); $ex2->declareExchange(); $time = microtime(true); var_dump($ex->bind($ex2->getName(), null, array('test' => 'passed', 'at' => $time, 'i am' => 'first'))); var_dump($ex->unbind($ex2->getName(), null, array('test' => 'passed', 'at' => $time, 'i am' => 'first'))); var_dump($ex->unbind($ex2->getName(), null, array('test' => 'passed', 'at' => $time, 'i am' => 'first'))); var_dump($ex->bind($ex2->getName(), '', array('test' => 'passed', 'at' => $time, 'i am' => 'second'))); var_dump($ex->unbind($ex2->getName(), '', array('test' => 'passed', 'at' => $time, 'i am' => 'second'))); var_dump($ex->unbind($ex2->getName(), '', array('test' => 'passed', 'at' => $time, 'i am' => 'second'))); ?> --EXPECT-- NULL NULL NULL NULL NULL NULLamqp-2.1.2/tests/amqpexchange_var_dump.phpt0000644000076500000240000000317714553444053020635 0ustar lstrojnystaff--TEST-- AMQPExchange var_dump --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); var_dump($ex); $ex->setArguments(array("x-ha-policy" => "all")); var_dump($ex); ?> --EXPECTF-- object(AMQPExchange)#3 (9) { ["connection":"AMQPExchange":private]=> %a ["channel":"AMQPExchange":private]=> %a ["name":"AMQPExchange":private]=> string(%d) "exchange-%s" ["type":"AMQPExchange":private]=> string(6) "fanout" ["passive":"AMQPExchange":private]=> bool(false) ["durable":"AMQPExchange":private]=> bool(false) ["autoDelete":"AMQPExchange":private]=> bool(false) ["internal":"AMQPExchange":private]=> bool(false) ["arguments":"AMQPExchange":private]=> array(0) { } } object(AMQPExchange)#3 (9) { ["connection":"AMQPExchange":private]=> %a ["channel":"AMQPExchange":private]=> %a ["name":"AMQPExchange":private]=> string(%d) "exchange-%s" ["type":"AMQPExchange":private]=> string(6) "fanout" ["passive":"AMQPExchange":private]=> bool(false) ["durable":"AMQPExchange":private]=> bool(false) ["autoDelete":"AMQPExchange":private]=> bool(false) ["internal":"AMQPExchange":private]=> bool(false) ["arguments":"AMQPExchange":private]=> array(1) { ["x-ha-policy"]=> string(3) "all" } } amqp-2.1.2/tests/amqpqueue-cancel-no-consumers.phpt0000644000076500000240000000226114553444053022144 0ustar lstrojnystaff--TEST-- AMQPQueue - orphaned envelope --SKIPIF-- createContext(); $cnn = new AMQPConnection(); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $extChannel = new AMQPChannel($cnn); $extChannel->qos(0, 3); $microtime = microtime('true'); $queue_name = 'queue-test-.' . $microtime; $exchange_name = 'exchnage-test-.' . $microtime; $queue_1 = new \AMQPQueue($extChannel); $queue_1->setName($queue_name); $queue_1->declareQueue(); var_dump($queue_1->purge()); $exchange = new \AMQPExchange($extChannel); $exchange->setType(AMQP_EX_TYPE_DIRECT); $exchange->setName($exchange_name); $exchange->declareExchange(); $exchange->publish( 'test message', $queue_name, AMQP_NOPARAM, []); $queue_2 = new \AMQPQueue($extChannel); $queue_2->setName($queue_name); $queue_2->consume(null, AMQP_NOPARAM, ''); $consumer_tag = $queue_2->getConsumerTag(); $queue_1->cancel($consumer_tag); echo "Canceled", PHP_EOL; --EXPECTF-- int(0) Canceled amqp-2.1.2/tests/amqpqueue_attributes.phpt0000644000076500000240000000222114553444053020535 0ustar lstrojnystaff--TEST-- AMQPQueue attributes --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $q = new AMQPQueue($ch); var_dump($q->setArguments($arr = array('existent' => 'value', 'false' => false))); echo 'Initial args: ', count($arr), ', queue args: ', count($q->getArguments()), PHP_EOL; var_dump($q->setArgument('foo', 'bar')); echo 'Initial args: ', count($arr), ', queue args: ', count($q->getArguments()), PHP_EOL; foreach (array('existent', 'false', 'nonexistent') as $key) { echo "$key: "; var_export($q->hasArgument($key)); echo ', '; try { var_export($q->getArgument($key)); } catch (AMQPQueueException $e) { echo 'Ex: ', $e->getMessage(); } echo PHP_EOL; } ?> --EXPECT-- NULL Initial args: 2, queue args: 2 NULL Initial args: 2, queue args: 3 existent: true, 'value' false: true, false nonexistent: false, Ex: The argument "nonexistent" does not exist amqp-2.1.2/tests/amqpqueue_bind_basic.phpt0000644000076500000240000000127314553444053020432 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); $queue->declareQueue(); var_dump($queue->bind($ex->getName(), 'routing.key')); $queue->delete(); $ex->delete(); ?> --EXPECT-- NULL amqp-2.1.2/tests/amqpqueue_bind_basic_empty_routing_key.phpt0000644000076500000240000000135414553444053024267 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); var_dump($ex->declareExchange()); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); var_dump($queue->declareQueue()); var_dump($queue->bind($ex->getName())); var_dump($queue->delete()); var_dump($ex->delete()); ?> --EXPECT-- NULL int(0) NULL int(0) NULL amqp-2.1.2/tests/amqpqueue_bind_basic_headers_arguments.phpt0000644000076500000240000000147214553444053024213 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_HEADERS); var_dump($ex->declareExchange()); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); var_dump($queue->declareQueue()); $arguments = array('x-match' => 'all', 'type' => 'custom'); var_dump($queue->bind($ex->getName(), '', $arguments)); var_dump($queue->delete()); var_dump($ex->delete()); ?> --EXPECT-- NULL int(0) NULL int(0) NULL amqp-2.1.2/tests/amqpqueue_bind_null_routing_key.phpt0000644000076500000240000000152214553444053022737 0ustar lstrojnystaff--TEST-- AMQPQueue bind/unbind with explicit null routing key --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); var_dump($ex->declareExchange()); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); var_dump($queue->declareQueue()); var_dump($queue->bind($ex->getName(), null)); var_dump($queue->unbind($ex->getName(), null)); var_dump($queue->delete()); var_dump($ex->delete()); ?> --EXPECT-- NULL int(0) NULL NULL int(0) NULL amqp-2.1.2/tests/amqpqueue_cancel.phpt0000644000076500000240000000660514553444053017606 0ustar lstrojnystaff--TEST-- AMQPQueue cancel --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); return $cnn; } function create_channel($cnn) { $channel = new AMQPChannel($cnn); $channel->setPrefetchCount(1); return $channel; } function create_exchange($channel) { $exchange = new AMQPExchange($channel); $exchange->setName('test_cancel_exchange'); $exchange->setType(AMQP_EX_TYPE_DIRECT); $exchange->declareExchange(); return $exchange; } function create_queue($channel) { $queue = new AMQPQueue($channel); $queue->setName('test_cancel_queue'); $queue->setFlags(AMQP_NOPARAM); $queue->declareQueue(); $queue->bind('test_cancel_exchange', 'test_cancel_routing_key'); return $queue; } class TrivialAcceptor { private $count = 0; private $maxCount; public function __construct($maxCount) { $this->maxCount = $maxCount; } public function accept($envelope, $queue) { var_dump( $envelope->getBody(), $envelope->getDeliveryTag(), $envelope->isRedelivery() ); echo "\n"; $queue->ack($envelope->getDeliveryTag()); $this->count++; return $this->count < $this->maxCount; } } function get_acceptor($count) { $acceptorObject = new TrivialAcceptor($count); return array($acceptorObject, 'accept'); } function send_message($exchange, $message) { $exchange->publish($message, 'test_cancel_routing_key'); } function wait_for_messages($queue, $consumer_tag, $message_count, $cancel_afterwards) { $consumeMethod = new ReflectionMethod('AMQPQueue', 'consume'); switch ($consumeMethod->getNumberOfParameters()) { case 3: $queue->consume(get_acceptor($message_count), AMQP_NOPARAM, $consumer_tag); if ($cancel_afterwards) $queue->cancel($consumer_tag); break; case 2: $queue->consume(get_acceptor($message_count), AMQP_NOPARAM); if ($cancel_afterwards) $queue->cancel(); break; default: echo "AMQP::consume() takes neither 2 nor 3 parameters"; exit(1); } } $consumer_tag_prefix = uniqid(); $send_conn = create_connection(); $send_chan = create_channel($send_conn); $exchange = create_exchange($send_chan); $recv_conn_1 = create_connection(); $recv_chan_1 = create_channel($recv_conn_1); $queue_1 = create_queue($recv_chan_1); send_message($exchange, 'message 0'); wait_for_messages($queue_1, $consumer_tag_prefix.'_1', 1, true); send_message($exchange, 'message 1'); send_message($exchange, 'message 2'); $recv_chan_2 = create_channel($recv_conn_1); $queue_2 = create_queue($recv_chan_2); wait_for_messages($queue_2, $consumer_tag_prefix.'_2', 2, false); $recv_conn_1->disconnect(); sleep(1); $recv_conn_2 = create_connection(); $recv_chan_3 = create_channel($recv_conn_2); $queue_3 = create_queue($recv_chan_3); send_message($exchange, 'message 3'); send_message($exchange, 'message 4'); wait_for_messages($queue_3, $consumer_tag_prefix.'_3', 2, false); $queue_3->delete(AMQP_NOPARAM); $exchange->delete(); ?> --EXPECT-- string(9) "message 0" int(1) bool(false) string(9) "message 1" int(1) bool(false) string(9) "message 2" int(2) bool(false) string(9) "message 3" int(1) bool(false) string(9) "message 4" int(2) bool(false) amqp-2.1.2/tests/amqpqueue_construct_basic.phpt0000644000076500000240000000065314553444053021543 0ustar lstrojnystaff--TEST-- AMQPQueue constructor --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $queue = new AMQPQueue($ch); echo get_class($queue); ?> --EXPECT-- AMQPQueueamqp-2.1.2/tests/amqpqueue_consume_basic.phpt0000644000076500000240000000571314553444053021172 0ustar lstrojnystaff--TEST-- AMQPQueue::consume basic --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName(), 'routing.*'); // Publish a message to the exchange with a routing key $ex->publish('message1', 'routing.1', AMQP_NOPARAM, array('content_type' => 'plain/test', 'headers' => array('foo' => 'bar'))); $ex->publish('message2', 'routing.2', AMQP_NOPARAM, array('delivery_mode' => AMQP_DELIVERY_MODE_PERSISTENT)); $ex->publish('message3', 'routing.3', AMQP_DURABLE); // this is wrong way to make messages persistent $count = 0; function consumeThingsTwoTimes($message, $queue) { global $count; echo "call #$count", PHP_EOL; // Read from the queue dump_message($message); echo PHP_EOL; $count++; if ($count >= 2) { return false; } return true; } // Read from the queue $q->consume("consumeThingsTwoTimes", AMQP_AUTOACK); $q->delete(); $ex->delete(); ?> --EXPECTF-- call #0 AMQPEnvelope getBody: string(8) "message1" getContentType: string(10) "plain/test" getRoutingKey: string(9) "routing.1" getConsumerTag: string(31) "amq.ctag-%s" getDeliveryTag: int(1) getDeliveryMode: int(1) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: NULL getType: NULL getTimeStamp: int(0) getPriority: int(0) getExpiration: NULL getUserId: NULL getAppId: NULL getMessageId: NULL getReplyTo: NULL getCorrelationId: NULL getHeaders: array(1) { ["foo"]=> string(3) "bar" } call #1 AMQPEnvelope getBody: string(8) "message2" getContentType: string(10) "text/plain" getRoutingKey: string(9) "routing.2" getConsumerTag: string(31) "amq.ctag-%s" getDeliveryTag: int(2) getDeliveryMode: int(2) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: NULL getType: NULL getTimeStamp: int(0) getPriority: int(0) getExpiration: NULL getUserId: NULL getAppId: NULL getMessageId: NULL getReplyTo: NULL getCorrelationId: NULL getHeaders: array(0) { } amqp-2.1.2/tests/amqpqueue_consume_multiple.phpt0000644000076500000240000000425214553444053021741 0ustar lstrojnystaff--TEST-- AMQPQueue::consume multiple --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch2 = new AMQPChannel($cnn); $ch3 = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . $id); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); // Create and bind queues $q1 = new AMQPQueue($ch); $q1->setName('queue-one-' . $id); $q1->declareQueue(); $q1->bind($ex->getName(), 'routing.one'); $q2 = new AMQPQueue($ch2); $q2->setName('queue-two-' . $id); $q2->declareQueue(); $q2->bind($ex->getName(), 'routing.two'); $q3 = new AMQPQueue($ch3); $q3->setName('queue-three-' . $id); $q3->declareQueue(); $q3->bind($ex->getName(), 'routing.three'); // Publish a message to the exchange with a routing key $ex->publish('message1', 'routing.one'); $ex->publish('message2', 'routing.two'); $ex->publish('message3', 'routing.three'); $count = 0; function consumeThings(AMQPEnvelope $message, AMQPQueue $queue) { global $count; echo "Message: {$message->getBody()}, routing key: {$message->getRoutingKey()}, consumer tag: {$message->getConsumerTag()}\n"; echo "Queue: {$queue->getName()}, consumer tag: {$queue->getConsumerTag()}\n"; echo "Queue and message consumer tag ", ($queue->getConsumerTag() == $message->getConsumerTag() ? 'matches' : 'do not match'), "\n"; echo PHP_EOL; $count++; $queue->ack($message->getDeliveryTag()); if ($count >= 2) { return false; } return true; } $q1->consume(); $q2->consume('consumeThings'); // This is important! $q1->cancel(); $q2->cancel(); ?> --EXPECTF-- Message: message1, routing key: routing.one, consumer tag: amq.ctag-%s Queue: queue-one-%s, consumer tag: amq.ctag-%s Queue and message consumer tag matches Message: message2, routing key: routing.two, consumer tag: amq.ctag-%s Queue: queue-two-%s, consumer tag: amq.ctag-%s Queue and message consumer tag matches amqp-2.1.2/tests/amqpqueue_consume_multiple_no_doubles.phpt0000644000076500000240000000145214553444053024151 0ustar lstrojnystaff--TEST-- AMQPQueue::consume multiple (no doubles) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); var_dump($q->getConsumerTag()); $q->consume(); var_dump($tag1=$q->getConsumerTag()); $q->consume(null, AMQP_JUST_CONSUME); var_dump($tag2=$q->getConsumerTag()); echo ($tag1 == $tag2 ? 'equals' : 'differs'), PHP_EOL; ?> --EXPECTF-- NULL string(%d) "amq.ctag-%s" string(%d) "amq.ctag-%s" equalsamqp-2.1.2/tests/amqpqueue_consume_nonexistent.phpt0000644000076500000240000000205314553444053022461 0ustar lstrojnystaff--TEST-- AMQPQueue::consume from nonexistent queue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(10); // both are empirical values that should be far enough to deal with busy RabbitMQ broker $cnn->setWriteTimeout(10); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('nonexistent-' . bin2hex(random_bytes(32))); try { $q->consume('noop'); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(); } ?> --EXPECTF-- AMQPQueueException(404): Server channel error: 404, message: NOT_FOUND - no queue 'nonexistent-%s' in vhost '/' amqp-2.1.2/tests/amqpqueue_consume_null_consumer_key.phpt0000644000076500000240000000201314553444053023634 0ustar lstrojnystaff--TEST-- AMQPQueue::consume basic --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName()); // Publish a message to the exchange with a routing key $ex->publish('message1'); $count = 0; function consume($message, $queue) { global $count; var_dump($count++); return false; } $q->consume(null, AMQP_AUTOACK, null); $q->delete(); $ex->delete(); ?> ==DONE== --EXPECTF-- ==DONE==amqp-2.1.2/tests/amqpqueue_consume_timeout.phpt0000644000076500000240000000223614553444053021574 0ustar lstrojnystaff--TEST-- AMQPQueue::consume with timeout --SKIPIF-- --FILE-- $timeout)); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $chan = new AMQPChannel($cnn); $queue = new AMQPQueue($chan); $queue->setFlags(AMQP_EXCLUSIVE); $queue->declareQueue(); $start = microtime(true); try { $queue->consume('nop'); } catch (AMQPException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(); echo PHP_EOL; } $end = microtime(true); $error = $end - $start - $timeout; $limit = abs(log10($timeout)); // empirical value echo 'timeout: ', $timeout, PHP_EOL; echo 'takes: ', $end - $start, PHP_EOL; echo 'error: ', $error, PHP_EOL; echo 'limit: ', $limit, PHP_EOL; echo abs($error) <= $limit ? 'timings OK' : 'timings failed'; // error should be less than 5% of timeout value $queue->delete(); ?> --EXPECTF-- AMQPQueueException(0): Consumer timeout exceed timeout: %f takes: %f error: %f limit: %f timings OK amqp-2.1.2/tests/amqpqueue_declare_basic.phpt0000644000076500000240000000137214553444053021115 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $queue = new AMQPQueue($ch); var_dump($queue->setName("queue-" . bin2hex(random_bytes(32)))); var_dump($queue->declareQueue()); var_dump($queue->bind($ex->getName(), 'routing.key')); var_dump($queue->delete()); var_dump($ex->delete()); ?> --EXPECT-- NULL int(0) NULL int(0) NULL amqp-2.1.2/tests/amqpqueue_declare_with_arguments.phpt0000644000076500000240000000167314553444053023100 0ustar lstrojnystaff--TEST-- AMQPQueue::declareQueue() - with arguments --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $queue = new AMQPQueue($ch); var_dump($queue->setName("queue-" . bin2hex(random_bytes(32)))); var_dump($queue->setArgument('x-dead-letter-exchange', '')); var_dump($queue->setArgument('x-dead-letter-routing-key', 'some key')); var_dump($queue->setArgument('x-message-ttl', 42)); var_dump($queue->setFlags(AMQP_AUTODELETE)); var_dump($queue->declareQueue()); var_dump($queue->delete()); ?> --EXPECT-- NULL NULL NULL NULL NULL int(0) int(0) amqp-2.1.2/tests/amqpqueue_declare_with_stalled_reference.phpt0000644000076500000240000000150614553444053024534 0ustar lstrojnystaff--TEST-- AMQPQueue - declare with stalled reference --SKIPIF-- --FILE-- declareQueue(); } catch (\Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECT-- AMQPChannelException(0): Could not declare queue. Stale reference to the channel object. amqp-2.1.2/tests/amqpqueue_delete_basic.phpt0000644000076500000240000000174614553444053020765 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); $queue->declareQueue(); $queue->bind($ex->getName()); var_dump($queue->delete()); var_dump($queue->delete(null)); $queue->declareQueue(); $queue->bind($ex->getName()); $ex->publish('test 1'); $ex->publish('test 2'); $ex->publish('test 3'); var_dump($queue->delete()); $ex->publish('test 1'); $ex->publish('test 2'); $ex->publish('test 3'); var_dump($queue->delete()); $ex->delete(); ?> --EXPECT-- int(0) int(0) int(3) int(0) amqp-2.1.2/tests/amqpqueue_empty_name.phpt0000644000076500000240000000126114553444053020510 0ustar lstrojnystaff--TEST-- AMQPQueue declared with empty name --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $queue = new AMQPQueue($ch); $queue->declareQueue(); var_dump(substr($queue->getName(), 0, strlen('amq.gen-'))); $queue->delete(); $ex->delete(); ?> --EXPECT-- string(8) "amq.gen-" amqp-2.1.2/tests/amqpqueue_get_basic.phpt0000644000076500000240000000650314553444053020276 0ustar lstrojnystaff--TEST-- AMQPQueue::get basic --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-'. bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName(), 'routing.*'); // Publish a message to the exchange with a routing key $ex->publish('message1', 'routing.1', AMQP_NOPARAM, array('content_type' => 'plain/test', 'headers' => array('foo' => 'bar'))); $ex->publish('message2', 'routing.2', AMQP_DURABLE); $ex->publish('message3', 'routing.3'); for ($i = 0; $i < 4; $i++) { echo "call #$i", PHP_EOL; // Read from the queue $msg = $q->get(AMQP_AUTOACK); dump_message($msg); echo PHP_EOL; } ?> --EXPECTF-- call #0 AMQPEnvelope getBody: string(8) "message1" getContentType: string(10) "plain/test" getRoutingKey: string(9) "routing.1" getConsumerTag: string(0) "" getDeliveryTag: int(1) getDeliveryMode: int(1) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: NULL getType: NULL getTimeStamp: int(0) getPriority: int(0) getExpiration: NULL getUserId: NULL getAppId: NULL getMessageId: NULL getReplyTo: NULL getCorrelationId: NULL getHeaders: array(1) { ["foo"]=> string(3) "bar" } call #1 AMQPEnvelope getBody: string(8) "message2" getContentType: string(10) "text/plain" getRoutingKey: string(9) "routing.2" getConsumerTag: string(0) "" getDeliveryTag: int(2) getDeliveryMode: int(1) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: NULL getType: NULL getTimeStamp: int(0) getPriority: int(0) getExpiration: NULL getUserId: NULL getAppId: NULL getMessageId: NULL getReplyTo: NULL getCorrelationId: NULL getHeaders: array(0) { } call #2 AMQPEnvelope getBody: string(8) "message3" getContentType: string(10) "text/plain" getRoutingKey: string(9) "routing.3" getConsumerTag: string(0) "" getDeliveryTag: int(3) getDeliveryMode: int(1) getExchangeName: string(%d) "exchange-%s" isRedelivery: bool(false) getContentEncoding: NULL getType: NULL getTimeStamp: int(0) getPriority: int(0) getExpiration: NULL getUserId: NULL getAppId: NULL getMessageId: NULL getReplyTo: NULL getCorrelationId: NULL getHeaders: array(0) { } call #3 NULL amqp-2.1.2/tests/amqpqueue_get_channel.phpt0000644000076500000240000000137614553444053020630 0ustar lstrojnystaff--TEST-- AMQPQueue getChannel() test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ch2 = new AMQPChannel($cnn); $q = new AMQPQueue($ch); echo $ch === $q->getChannel() ? 'same' : 'not same', PHP_EOL; echo $ch2 === $q->getChannel() ? 'same' : 'not same', PHP_EOL; $old_prefetch = $ch->getPrefetchCount(); $new_prefetch = 999; $q->getChannel()->setPrefetchCount($new_prefetch); echo $ch->getPrefetchCount() == $new_prefetch ? 'by ref' : 'copy', PHP_EOL; ?> --EXPECT-- same not same by ref amqp-2.1.2/tests/amqpqueue_get_connection.phpt0000644000076500000240000000134614553444053021354 0ustar lstrojnystaff--TEST-- AMQPQueue getConnection test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $q = new AMQPQueue($ch); $cnn2 = new AMQPConnection(); echo $cnn === $q->getConnection() ? 'same' : 'not same', PHP_EOL; echo $cnn2 === $q->getConnection() ? 'same' : 'not same', PHP_EOL; $old_host = $cnn->getHost(); $new_host = 'test'; $q->getConnection()->setHost($new_host); echo $cnn->getHost() == $new_host ? 'by ref' : 'copy', PHP_EOL; ?> --EXPECT-- same not same by ref amqp-2.1.2/tests/amqpqueue_get_empty_body.phpt0000644000076500000240000000203114553444053021360 0ustar lstrojnystaff--TEST-- AMQPQueue::get empty body --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName(), 'routing.*'); // Publish a message to the exchange with a routing key $ex->publish('', 'routing.1'); // Read from the queue $msg = $q->get(AMQP_AUTOACK); echo "'" . $msg->getBody() . "'\n"; $msg = $q->get(AMQP_AUTOACK); if ($msg === null) { echo "No more messages\n"; } $ex->delete(); $q->delete(); ?> --EXPECT-- '' No more messages amqp-2.1.2/tests/amqpqueue_get_headers.phpt0000644000076500000240000000301114553444053020617 0ustar lstrojnystaff--TEST-- AMQPQueue::get headers --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); // Bind it on the exchange to routing.key $q->bind($ex->getName(), 'routing.*'); // Publish a message to the exchange with a routing key $ex->publish('body', 'routing.1', AMQP_NOPARAM, array("headers" => array( "first" => "one", "second" => 2 ))); // Read from the queue $msg = $q->get(AMQP_AUTOACK); echo $msg->getBody() . "\n"; var_dump($msg->getHeaders()); echo $msg->getContentType() . "\n"; var_dump($msg->hasHeader("first")); echo $msg->getHeader("first") . "\n"; echo $msg->getHeader("second") . "\n"; echo 'Has nonexistent header: ', var_export($msg->hasHeader("nonexistent"), true), PHP_EOL; echo 'Get nonexistent header: ', var_export($msg->getHeader("nonexistent"), true), PHP_EOL; $ex->delete(); $q->delete(); ?> --EXPECT-- body array(2) { ["first"]=> string(3) "one" ["second"]=> int(2) } text/plain bool(true) one 2 Has nonexistent header: false Get nonexistent header: NULL amqp-2.1.2/tests/amqpqueue_get_nonexistent.phpt0000644000076500000240000000177514553444053021601 0ustar lstrojnystaff--TEST-- AMQPQueue::get from nonexistent queue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->setReadTimeout(10); // both are empirical values that should be far enough to deal with busy RabbitMQ broker $cnn->setWriteTimeout(10); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('nonexistent-' . bin2hex(random_bytes(32))); try { $q->get(); } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(); } ?> --EXPECTF-- AMQPQueueException(404): Server channel error: 404, message: NOT_FOUND - no queue 'nonexistent-%s' in vhost '/' amqp-2.1.2/tests/amqpqueue_headers_with_bool.phpt0000644000076500000240000000240714553444053022036 0ustar lstrojnystaff--TEST-- AMQPQueue::get headers with bool values --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName(), '#'); // publish a message: $ex->publish( 'body', 'routing.1', AMQP_NOPARAM, array( 'headers' => array( 'foo' => 'bar', 'true' => true, 'false' => false, ) ) ); // Read from the queue $msg = $q->get(AMQP_AUTOACK); var_dump($msg->getHeaders()); echo $msg->getHeader('foo') . "\n"; var_dump($msg->hasHeader('true'), $msg->getHeader('true')); var_dump($msg->hasHeader('false'), $msg->getHeader('false')); $ex->delete(); $q->delete(); ?> --EXPECT-- array(3) { ["foo"]=> string(3) "bar" ["true"]=> bool(true) ["false"]=> bool(false) } bar bool(true) bool(true) bool(true) bool(false) amqp-2.1.2/tests/amqpqueue_headers_with_float.phpt0000644000076500000240000000323614553444053022211 0ustar lstrojnystaff--TEST-- AMQPQueue::get headers with float values --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName(), '#'); // publish a message: $ex->publish( 'body', 'routing.1', AMQP_NOPARAM, array( 'headers' => array( 'foo' => 'bar', 'positive' => 2.3, 'negative' => -1022.123456789, 'scientific' => 10E2, 'scientific_big' => 10E23, ) ) ); // Read from the queue $msg = $q->get(AMQP_AUTOACK); var_dump($msg->getHeaders()); echo $msg->getHeader('foo') . "\n"; var_dump($msg->hasHeader('positive'), $msg->getHeader('positive')); var_dump($msg->hasHeader('negative'), $msg->getHeader('negative')); var_dump($msg->hasHeader('scientific'), $msg->getHeader('scientific')); var_dump($msg->hasHeader('scientific_big'), $msg->getHeader('scientific_big')); $ex->delete(); $q->delete(); ?> --EXPECT-- array(5) { ["foo"]=> string(3) "bar" ["positive"]=> float(2.3) ["negative"]=> float(-1022.123456789) ["scientific"]=> float(1000) ["scientific_big"]=> float(1.0E+24) } bar bool(true) float(2.3) bool(true) float(-1022.123456789) bool(true) float(1000) bool(true) float(1.0E+24) amqp-2.1.2/tests/amqpqueue_headers_with_null.phpt0000644000076500000240000000206614553444053022056 0ustar lstrojnystaff--TEST-- AMQPQueue::get headers --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName(), '#'); // publish a message: $ex->publish( 'body', 'routing.1', AMQP_NOPARAM, array( 'headers' => array( 'foo' => 'bar', 'null' => NULL ) ) ); // Read from the queue $msg = $q->get(AMQP_AUTOACK); var_dump($msg->getHeaders()); echo $msg->getHeader('foo') . "\n"; var_dump($msg->getHeader('null')); $ex->delete(); $q->delete(); ?> --EXPECT-- array(2) { ["foo"]=> string(3) "bar" ["null"]=> NULL } bar NULL amqp-2.1.2/tests/amqpqueue_nack.phpt0000644000076500000240000000260614553444053017272 0ustar lstrojnystaff--TEST-- AMQPQueue::nack --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('testnack' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $exchangeName = $ex->getName(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('testnack' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($exchangeName, '#'); // Bind it on the exchange to routing.key // Publish a message to the exchange with a routing key $ex->publish('message', 'foo'); $env = $q->get(AMQP_NOPARAM); echo $env->getBody() . PHP_EOL; echo $env->isRedelivery() ? 'true' : 'false'; echo PHP_EOL; // send the message back to the queue $q->nack($env->getDeliveryTag(), AMQP_REQUEUE); // read again $env2 = $q->get(AMQP_NOPARAM); if (false !== $env2) { $q->ack($env2->getDeliveryTag(), null); echo $env2->getBody() . PHP_EOL; echo $env2->isRedelivery() ? 'true' : 'false'; echo PHP_EOL; } else { echo "could not read message" . PHP_EOL; } $ex->delete(); $q->delete(); --EXPECT-- message false message true amqp-2.1.2/tests/amqpqueue_nested_arrays.phpt0000644000076500000240000000237214553444053021221 0ustar lstrojnystaff--TEST-- AMQPQueue::get headers --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName(), '#'); // publish a message: $ex->publish( 'body', 'routing.1', AMQP_NOPARAM, array( 'headers' => array( 'foo' => 'bar', 'baz' => array('a', 'bc', 'def') ) ) ); // Read from the queue $msg = $q->get(AMQP_AUTOACK); var_dump($msg->getHeaders()); echo $msg->getHeader('foo') . "\n"; var_dump($msg->getHeader('baz')); $ex->delete(); $q->delete(); ?> --EXPECT-- array(2) { ["foo"]=> string(3) "bar" ["baz"]=> array(3) { [0]=> string(1) "a" [1]=> string(2) "bc" [2]=> string(3) "def" } } bar array(3) { [0]=> string(1) "a" [1]=> string(2) "bc" [2]=> string(3) "def" } amqp-2.1.2/tests/amqpqueue_nested_headers.phpt0000644000076500000240000000544114553444053021333 0ustar lstrojnystaff--TEST-- AMQPQueue::get headers --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // create an error exchange and bind a queue to it: $errorXchange = new AMQPExchange($ch); $errorXchange->setName('errorXchange' . bin2hex(random_bytes(32))); $errorXchange->setType(AMQP_EX_TYPE_TOPIC); $errorXchange->declareExchange(); $errorQ = new AMQPQueue($ch); $errorQ->setName('errorQueue' . bin2hex(random_bytes(32))); $errorQ->declareQueue(); $errorQ->bind($errorXchange->getName(), '#'); // Declare a new exchange and queue using this dead-letter-exchange: $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_TOPIC); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue-' . bin2hex(random_bytes(32))); $q->setArgument('x-dead-letter-exchange', $errorXchange->getName()); $q->declareQueue(); $q->bind($ex->getName(), '#'); // publish a message: $ex->publish( 'body', 'routing.1', AMQP_NOPARAM, array( 'headers' => array( 'foo' => 'fval', 'bar' => array(array('aa', 'bb', array('bar_nested' => 'nested'))), 'baz' => array('a', 'bc', 'def', 123, 'g'), 'bla' => array('one' => 2), ) ) ); // Read from the queue and reject, so it gets dead-lettered: $msg = $q->get(AMQP_NOPARAM); $q->nack($msg->getDeliveryTag()); sleep(1); // Now read from the error queue: $msg = $errorQ->get(AMQP_AUTOACK); $header = $msg->getHeader('x-death'); echo isset($header[0]['count']) ? 'count found' : 'count not found', PHP_EOL; unset($header[0]['count']); var_dump($header); var_dump($msg->getHeader('foo')); var_dump($msg->getHeader('bar')); var_dump($msg->getHeader('baz')); var_dump($msg->getHeader('bla')); $ex->delete(); $q->delete(); $errorXchange->delete(); $errorQ->delete(); ?> ==DONE== --EXPECTF-- count %s array(1) { [0]=> array(5) { ["reason"]=> string(8) "rejected" ["queue"]=> string(%d) "queue-%s" ["time"]=> object(AMQPTimestamp)#%d (1) { ["timestamp":"AMQPTimestamp":private]=> float(%d) } ["exchange"]=> string(%d) "exchange-%s" ["routing-keys"]=> array(1) { [0]=> string(9) "routing.1" } } } string(4) "fval" array(1) { [0]=> array(3) { [0]=> string(2) "aa" [1]=> string(2) "bb" [2]=> array(1) { ["bar_nested"]=> string(6) "nested" } } } array(5) { [0]=> string(1) "a" [1]=> string(2) "bc" [2]=> string(3) "def" [3]=> int(123) [4]=> string(1) "g" } array(1) { ["one"]=> int(2) } ==DONE==amqp-2.1.2/tests/amqpqueue_purge_basic.phpt0000644000076500000240000000021614553444053020634 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- --EXPECT-- amqp-2.1.2/tests/amqpqueue_recover.phpt0000644000076500000240000000222414553444053020017 0ustar lstrojnystaff--TEST-- AMQPQueue::nack --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('testrecover-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $exchangeName = $ex->getName(); $q = new AMQPQueue($ch); $q->setName('testrecover-' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($exchangeName); $ex->publish('message'); function inspectMessage(AMQPQueue $q) { $msg = $q->get(); echo $msg->getBody(), PHP_EOL; echo $msg->isRedelivery() ? 'true' : 'false'; echo PHP_EOL; } inspectMessage($q); $q->recover(); inspectMessage($q); $q->recover(true); inspectMessage($q); try { $q->recover(false); } catch (AMQPConnectionException $e) { echo $e->getMessage(), PHP_EOL; } --EXPECT-- message false message true message true Server connection error: 540, message: NOT_IMPLEMENTED - requeue=false amqp-2.1.2/tests/amqpqueue_setArgument.phpt0000644000076500000240000001035714553444053020656 0ustar lstrojnystaff--TEST-- AMQPQueue::setArgument() test --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $heartbeat = 10; $q_dead_name = 'test.queue.dead.' . bin2hex(random_bytes(32)); $q_name = 'test.queue.' . bin2hex(random_bytes(32)); $q = new AMQPQueue($ch); $q->setName($q_name); $q->setFlags(AMQP_AUTODELETE); $q->declareQueue(); var_dump($q); class MyValue implements AMQPValue { public function toAmqpValue() { return "foo"; } } $q_dead = new AMQPQueue($ch); $q_dead->setName($q_dead_name); $q_dead->setArgument('x-dead-letter-exchange', ''); $q_dead->setArgument('x-dead-letter-routing-key', $q_name); $q_dead->setArgument('x-message-ttl', $heartbeat * 10 * 1000); $q_dead->setArgument('x-null', null); $q_dead->setArgument('x-array', [0, 3]); $q_dead->setArgument('x-hash', ['foo' => 'bar']); $q_dead->setArgument('x-timestamp', new AMQPTimestamp(404)); $q_dead->setArgument('x-decimal', new AMQPDecimal(1, 2)); $q_dead->setArgument('x-custom-value', new MyValue()); $q_dead->setFlags(AMQP_AUTODELETE); $q_dead->declareQueue(); var_dump($q_dead); $q_dead->removeArgument('x-null'); $q_dead->removeArgument('x-does-not-exist'); var_dump($q_dead); ?> --EXPECTF-- object(AMQPQueue)#%d (%d) { ["connection":"AMQPQueue":private]=> %a ["channel":"AMQPQueue":private]=> %a ["name":"AMQPQueue":private]=> string(%d) "test.queue.%s" ["consumerTag":"AMQPQueue":private]=> NULL ["passive":"AMQPQueue":private]=> bool(false) ["durable":"AMQPQueue":private]=> bool(false) ["exclusive":"AMQPQueue":private]=> bool(false) ["autoDelete":"AMQPQueue":private]=> bool(true) ["arguments":"AMQPQueue":private]=> array(0) { } } object(AMQPQueue)#%d (%d) { ["connection":"AMQPQueue":private]=> %a ["channel":"AMQPQueue":private]=> %a ["name":"AMQPQueue":private]=> string(%d) "test.queue.dead.%s" ["consumerTag":"AMQPQueue":private]=> NULL ["passive":"AMQPQueue":private]=> bool(false) ["durable":"AMQPQueue":private]=> bool(false) ["exclusive":"AMQPQueue":private]=> bool(false) ["autoDelete":"AMQPQueue":private]=> bool(true) ["arguments":"AMQPQueue":private]=> array(%d) { ["x-dead-letter-exchange"]=> string(0) "" ["x-dead-letter-routing-key"]=> string(%d) "test.queue.%s" ["x-message-ttl"]=> int(100000) ["x-null"]=> NULL ["x-array"]=> array(2) { [0]=> int(0) [1]=> int(3) } ["x-hash"]=> array(1) { ["foo"]=> string(3) "bar" } ["x-timestamp"]=> object(AMQPTimestamp)#%d (%d) { ["timestamp":"AMQPTimestamp":private]=> float(404) } ["x-decimal"]=> object(AMQPDecimal)#%d (%d) { ["exponent":"AMQPDecimal":private]=> int(1) ["significand":"AMQPDecimal":private]=> int(2) } ["x-custom-value"]=> object(MyValue)#%d (%d) { } } } object(AMQPQueue)#%d (%d) { ["connection":"AMQPQueue":private]=> %a ["channel":"AMQPQueue":private]=> %a ["name":"AMQPQueue":private]=> string(%d) "test.queue.dead.%s" ["consumerTag":"AMQPQueue":private]=> NULL ["passive":"AMQPQueue":private]=> bool(false) ["durable":"AMQPQueue":private]=> bool(false) ["exclusive":"AMQPQueue":private]=> bool(false) ["autoDelete":"AMQPQueue":private]=> bool(true) ["arguments":"AMQPQueue":private]=> array(%d) { ["x-dead-letter-exchange"]=> string(0) "" ["x-dead-letter-routing-key"]=> string(%d) "test.queue.%s" ["x-message-ttl"]=> int(100000) ["x-array"]=> array(2) { [0]=> int(0) [1]=> int(3) } ["x-hash"]=> array(1) { ["foo"]=> string(3) "bar" } ["x-timestamp"]=> object(AMQPTimestamp)#%d (%d) { ["timestamp":"AMQPTimestamp":private]=> float(404) } ["x-decimal"]=> object(AMQPDecimal)#%d (%d) { ["exponent":"AMQPDecimal":private]=> int(1) ["significand":"AMQPDecimal":private]=> int(2) } ["x-custom-value"]=> object(MyValue)#%d (%d) { } } } amqp-2.1.2/tests/amqpqueue_setFlags.phpt0000644000076500000240000000072214553444053020123 0ustar lstrojnystaff--TEST-- AMQPQueue::setFlags(null) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $q = new AMQPQueue($ch); $q->setFlags(null); var_dump($q->getFlags()) ?> ==DONE== --EXPECTF-- int(0) ==DONE== amqp-2.1.2/tests/amqpqueue_unbind_basic_empty_routing_key.phpt0000644000076500000240000000150414553444053024627 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); $queue->declareQueue(); var_dump($queue->bind($ex->getName())); var_dump($queue->unbind($ex->getName())); var_dump($queue->bind($ex->getName(), null)); var_dump($queue->unbind($ex->getName(), null)); $queue->delete(); $ex->delete(); ?> --EXPECT-- NULL NULL NULL NULL amqp-2.1.2/tests/amqpqueue_unbind_basic_headers_arguments.phpt0000644000076500000240000000147114553444053024555 0ustar lstrojnystaff--TEST-- AMQPQueue --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_DIRECT); $ex->declareExchange(); $queue = new AMQPQueue($ch); $queue->setName("queue-" . bin2hex(random_bytes(32))); $queue->declareQueue(); $arguments = array('x-match' => 'all', 'type' => 'custom'); var_dump($queue->bind($ex->getName(), '', $arguments)); var_dump($queue->unbind($ex->getName(), '', $arguments)); $queue->delete(); $ex->delete(); ?> --EXPECT-- NULL NULL amqp-2.1.2/tests/amqpqueue_var_dump.phpt0000644000076500000240000000211014553444053020161 0ustar lstrojnystaff--TEST-- AMQPQueue var_dump --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); // Declare a new exchange $ex = new AMQPExchange($ch); $ex->setName('exchange1'); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); // Create a new queue $q = new AMQPQueue($ch); $q->setName('queue_var_dump'); $q->declareQueue(); var_dump($q); ?> --EXPECTF-- object(AMQPQueue)#4 (9) { ["connection":"AMQPQueue":private]=> %a ["channel":"AMQPQueue":private]=> %a ["name":"AMQPQueue":private]=> string(14) "queue_var_dump" ["consumerTag":"AMQPQueue":private]=> NULL ["passive":"AMQPQueue":private]=> bool(false) ["durable":"AMQPQueue":private]=> bool(false) ["exclusive":"AMQPQueue":private]=> bool(false) ["autoDelete":"AMQPQueue":private]=> bool(true) ["arguments":"AMQPQueue":private]=> array(0) { } } amqp-2.1.2/tests/amqptimestamp.phpt0000644000076500000240000000211514553444053017150 0ustar lstrojnystaff--TEST-- AMQPTimestamp --SKIPIF-- --FILE-- getTimestamp(), (string) $timestamp); var_dump($timestamp === $timestamp->toAmqpValue()); var_dump($timestamp instanceof AMQPValue); $timestamp = new AMQPTimestamp(100000.1); var_dump($timestamp->getTimestamp(), (string) $timestamp); try { new AMQPTimestamp(AMQPTimestamp::MIN - 1); } catch (AMQPValueException $e) { echo $e->getMessage() . "\n"; } try { new AMQPTimestamp(INF); } catch (AMQPValueException $e) { echo $e->getMessage() . "\n"; } var_dump((new ReflectionClass("AMQPTimestamp"))->isFinal()); var_dump(number_format(AMQPTimestamp::MAX, 0, '.', '_')); var_dump(AMQPTimestamp::MIN); ?> ==END== --EXPECTF-- float(100000) string(6) "100000" bool(true) bool(true) float(100000) string(6) "100000" The timestamp parameter must be greater than 0. The timestamp parameter must be less than 18446744073709551616. bool(true) string(26) "18_446_744_073_709_551_616" float(0) ==END==amqp-2.1.2/tests/bug_17831.phpt0000644000076500000240000000123514553444053015610 0ustar lstrojnystaff--TEST-- Segfault when publishing to non existent exchange --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange-" . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); try { $ex->publish("data", "bar"); echo "Success\n"; } catch (Exception $e) { echo "Success\n"; } $ex->delete(); ?> --EXPECT-- Success amqp-2.1.2/tests/bug_19707.phpt0000644000076500000240000000312214553444053015611 0ustar lstrojnystaff--TEST-- AMQPQueue::get() doesn't return the message --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName("exchange_testing_19707"); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue' . bin2hex(random_bytes(32))); $q->setFlags(AMQP_DURABLE); $q->declareQueue(); $q->bind($ex->getName(), 'routing.key'); $ex->publish('message', 'routing.key'); $msg = $q->get(); echo "message received from get:\n"; $funcs = array( 'getAppId', 'getBody', 'getContentEncoding', 'getContentType', 'getCorrelationId', 'getDeliveryTag', 'getExchangeName', 'getExpiration', 'getHeaders', 'getMessageId', 'getPriority', 'getReplyTo', 'getRoutingKey', 'getTimeStamp', 'getType', 'getUserId', 'isRedelivery' ); foreach ($funcs as $func) { printf("%s => %s\n", $func, var_export($msg->$func(), true)); }; $q->delete(); $ex->delete(); ?> --EXPECT-- message received from get: getAppId => NULL getBody => 'message' getContentEncoding => NULL getContentType => 'text/plain' getCorrelationId => NULL getDeliveryTag => 1 getExchangeName => 'exchange_testing_19707' getExpiration => NULL getHeaders => array ( ) getMessageId => NULL getPriority => 0 getReplyTo => NULL getRoutingKey => 'routing.key' getTimeStamp => 0 getType => NULL getUserId => NULL isRedelivery => falseamqp-2.1.2/tests/bug_19840.phpt0000644000076500000240000000112414553444053015607 0ustar lstrojnystaff--TEST-- Bug 19840: Connection Exception --SKIPIF-- --FILE-- connect(); echo "No exception thrown\n"; } catch (Exception $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(); } ?> --EXPECT-- AMQPConnectionException(0): Socket error: could not connect to host, hostname lookup failedamqp-2.1.2/tests/bug_351.phpt0000644000076500000240000000222614553444053015436 0ustar lstrojnystaff--TEST-- AMQPEnvelope::getBody returns false instead of empty string --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('exchange' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declareExchange(); $q = new AMQPQueue($ch); $q->setName('queue1' . bin2hex(random_bytes(32))); $q->declareQueue(); $q->bind($ex->getName(), '*'); $ex->publish(''); $msg = $q->get(AMQP_AUTOACK); echo "MSG1\n"; var_dump($msg->getBody(), $msg->getRoutingKey(), $msg->getConsumerTag(), $msg->getDeliveryTag(), $msg->getExchangeName()); $msg2 = new AMQPEnvelope(); echo "MSG2\n"; var_dump($msg2->getBody(), $msg2->getRoutingKey(), $msg2->getConsumerTag(), $msg2->getDeliveryTag(), $msg2->getExchangeName()); ?> ==DONE== --EXPECTF-- MSG1 string(0) "" string(0) "" string(0) "" int(%d) string(%d) "exchange%s" MSG2 string(0) "" string(0) "" NULL NULL NULL ==DONE==amqp-2.1.2/tests/bug_385.phpt0000644000076500000240000000212114553444053015437 0ustar lstrojnystaff--TEST-- #385 Testing consumer cleared on cancel --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $exchange = new AMQPExchange($channel); $queue = new AMQPQueue($channel); $queue->declareQueue(); // Asynchronously consuming $queue->consume(null, AMQP_NOPARAM, 'someid'); // Showing that current consumer tag is from last consume call echo $queue->getConsumerTag() ?? 'none'; echo PHP_EOL; // Cancel by a different consumer tag than the latest one -> expecting the consumer tag to not clear $queue->cancel('someotherid'); echo $queue->getConsumerTag() ?? 'none'; echo PHP_EOL; // Cancel by consumer tag -> expecting the current consumer tag to clear $queue->cancel('someid'); // Current consumer tag should be null as consumer has been cancelled echo $queue->getConsumerTag() ?? 'none'; ?> --EXPECTF-- someid someid none amqp-2.1.2/tests/bug_61533.phpt0000644000076500000240000000143114553444053015604 0ustar lstrojnystaff--TEST-- Constructing AMQPQueue with AMQPConnection segfaults --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $chan = new AMQPChannel($cnn); if (!class_exists('TypeError')) { class TypeError extends Exception {} } try { error_reporting(error_reporting() & ~E_WARNING); $queue = new AMQPQueue($cnn); } catch (TypeError $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), '.', PHP_EOL; // we pad exception message with dot to make EXPETF be the same on PHP 5 and PHP 7 } ?> --EXPECTF-- %s AMQPChannel%s AMQPConnection%s amqp-2.1.2/tests/bug_62354.phpt0000644000076500000240000000112314553444053015604 0ustar lstrojnystaff--TEST-- Constructing AMQPQueue with AMQPConnection segfaults --SKIPIF-- --FILE-- conn = new AMQPConnection(); $funcs = array( 'getHost', 'getLogin', 'getPassword', 'getPort', 'getVHost', 'isConnected' ); foreach ($funcs as $func) { printf("%s => %s\n", $func, var_export($o->conn->$func(), true)); }; ?> --EXPECT-- getHost => 'localhost' getLogin => 'guest' getPassword => 'guest' getPort => 5672 getVHost => '/' isConnected => false amqp-2.1.2/tests/bug_gh147.phpt0000644000076500000240000000277514553444053015771 0ustar lstrojnystaff--TEST-- #147 Segfault when catchable fatal error happens in consumer --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $channel->setPrefetchCount(2); $exchange = new AMQPExchange($channel); $exchange->setType(AMQP_EX_TYPE_TOPIC); $exchange->setName('test_' . $time); $exchange->setFlags(AMQP_AUTODELETE); $exchange->declareExchange(); $queue = new AMQPQueue($channel); $queue->setName('test_' . $time); $queue->declareQueue(); $queue->bind($exchange->getName(), 'test'); $exchange->publish('test message', 'test'); echo 'start'.PHP_EOL; try { $queue->consume(function(AMQPEnvelope $e) use (&$consume) { echo 'consuming'.PHP_EOL; $e . 'should fail'; return false; }); } catch (Throwable $ex) { // Exception is only thrown as of PHP 7.4 echo $ex->getMessage(); exit; } echo 'done', PHP_EOL; ?> --EXPECTF-- start consuming Object of class %s could not be converted to stringamqp-2.1.2/tests/bug_gh155_direct_reply_to.phpt0000644000076500000240000000366114553444053021232 0ustar lstrojnystaff--TEST-- #155 RabbitMQ's Direct reply-to (related to consume multiple) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $exchange = new AMQPExchange($channel); $q_reply_to = new AMQPQueue($channel); $q_reply_to->setName('amq.rabbitmq.reply-to'); $q_reply_to->consume(null, AMQP_AUTOACK); // this will be kind out long-living queue to $q_request = new AMQPQueue($channel); $q_request->setName('reply-to-requests'); $q_request->setFlags(AMQP_DURABLE); $q_request->declareQueue(); $q_request->purge(); $q_request_name = $q_request->getName(); echo 'Publishing request...' . PHP_EOL; $exchange->publish('request', $q_request_name, AMQP_NOPARAM, array('reply_to' => 'amq.rabbitmq.reply-to')); $request_message = $q_request->get(AMQP_AUTOACK); $reply_to = $request_message->getReplyTo(); echo 'Reply-to queue: ', $reply_to, PHP_EOL; echo 'Prepare response queue...' . PHP_EOL; $channel_2 = new AMQPChannel($cnn); $q_reply = new AMQPQueue($channel_2); $q_reply->setName($reply_to); $q_reply->setFlags(AMQP_PASSIVE); $q_reply->declareQueue(); echo 'Publishing response...' . PHP_EOL; $exchange->publish('response', $reply_to); echo 'Waiting for reply...' . PHP_EOL; $q_reply_to->consume(function (AMQPEnvelope $message, AMQPQueue $queue) { echo $message->getBody() . ': ' . $message->getRoutingKey() . PHP_EOL; echo 'Received on ', $queue->getName(), ' queue', PHP_EOL; return false; }, AMQP_JUST_CONSUME); echo 'done', PHP_EOL; ?> --EXPECTF-- Publishing request... Reply-to queue: amq.rabbitmq.reply-to.%s.%s== Prepare response queue... Publishing response... Waiting for reply... response: amq.rabbitmq.reply-to.%s.%s== Received on amq.rabbitmq.reply-to queue doneamqp-2.1.2/tests/bug_gh50-1.phpt0000644000076500000240000000123714553444053016030 0ustar lstrojnystaff--TEST-- Channel creation race condition (https://github.com/pdezwart/php-amqp/issues/50) (1) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); for ($i = 0; $i < 3; $i++) { $channel = new AMQPChannel($cnn); var_dump($channel->getChannelId()); $queue = new AMQPQueue($channel); $queue->setName('test' . $i); $queue->declareQueue(); $queue->delete(); } ?> ==DONE== --EXPECT-- int(1) int(2) int(3) ==DONE== amqp-2.1.2/tests/bug_gh50-2.phpt0000644000076500000240000000130214553444053016022 0ustar lstrojnystaff--TEST-- Channel creation race condition (https://github.com/pdezwart/php-amqp/issues/50) (2) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); for ($i = 0; $i < 3; $i++) { $channel = new AMQPChannel($cnn); var_dump($channel->getChannelId()); $queue = new AMQPQueue($channel); $queue->setName('test' . $i); $queue->declareQueue(); $queue->delete(); unset($queue); unset($channel); } ?> ==DONE== --EXPECT-- int(1) int(1) int(1) ==DONE== amqp-2.1.2/tests/bug_gh50-3.phpt0000644000076500000240000000177014553444053016034 0ustar lstrojnystaff--TEST-- Channel creation race condition (https://github.com/pdezwart/php-amqp/issues/50) (3) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); for ($i = 0; $i < 3; $i++) { $channel = new AMQPChannel($cnn); var_dump($channel->getChannelId()); $queue = new AMQPQueue($channel); $queue->setName('test' . $i); $queue->declareQueue(); $queue->delete(); } $cnn = new AMQPConnection(); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); for ($i = 0; $i < 3; $i++) { $channel = new AMQPChannel($cnn); var_dump($channel->getChannelId()); $queue = new AMQPQueue($channel); $queue->setName('test' . $i); $queue->declareQueue(); $queue->delete(); } ?> ==DONE== --EXPECT-- int(1) int(2) int(3) int(1) int(2) int(3) ==DONE== amqp-2.1.2/tests/bug_gh50-4.phpt0000644000076500000240000000205214553444053016027 0ustar lstrojnystaff--TEST-- Channel creation race condition (https://github.com/pdezwart/php-amqp/issues/50) (4) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channels = array(); for ($i = 0; $i < 3; $i++) { $channel = $channels[] = new AMQPChannel($cnn); var_dump($channel->getChannelId()); $queue = new AMQPQueue($channel); $queue->setName('test' . $i); $queue->declareQueue(); $queue->delete(); } $cnn = new AMQPConnection(); $cnn->setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); for ($i = 0; $i < 3; $i++) { $channel = $channels[] = new AMQPChannel($cnn); var_dump($channel->getChannelId()); $queue = new AMQPQueue($channel); $queue->setName('test' . $i); $queue->declareQueue(); $queue->delete(); } ?> ==DONE== --EXPECT-- int(1) int(2) int(3) int(1) int(2) int(3) ==DONE== amqp-2.1.2/tests/bug_gh53-2.phpt0000644000076500000240000000200214553444053016023 0ustar lstrojnystaff--TEST-- Upgrade to RabbitMQ 3.1.0-1: AMQPConnectionException: connection closed unexpectedly (2) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $exchange = new AMQPExchange($channel); $exchange->setName('exchange' . bin2hex(random_bytes(32))); $exchange->setType(AMQP_EX_TYPE_TOPIC); $exchange->declareExchange(); $queue = new AMQPQueue($channel); $queue->setName('queue1' . bin2hex(random_bytes(32))); $queue->declareQueue(); $queue->bind($exchange->getName(), '#'); $exchange->publish('body1', 'routing.1'); $exchange->publish('body2', 'routing.1'); $msg = $queue->get(AMQP_AUTOACK); var_dump($msg->getBody()); $msg = $queue->get(AMQP_AUTOACK); var_dump($msg->getBody()); ?> ==DONE== --EXPECT-- string(5) "body1" string(5) "body2" ==DONE== amqp-2.1.2/tests/bug_gh53.phpt0000644000076500000240000000220314553444053015667 0ustar lstrojnystaff--TEST-- Upgrade to RabbitMQ 3.1.0-1: AMQPConnectionException: connection closed unexpectedly --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); var_dump($channel->getPrefetchSize()); var_dump($channel->getPrefetchCount()); $channel->setPrefetchCount(10); var_dump($channel->getPrefetchSize()); var_dump($channel->getPrefetchCount()); // NOTE: RabbitMQ Doesn't support prefetch size try { $channel->setPrefetchSize(1024); } catch (AMQPConnectionException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } var_dump($channel->isConnected()); var_dump($cnn->isConnected()); var_dump($channel->getPrefetchSize()); var_dump($channel->getPrefetchCount()); ?> --EXPECTF-- int(0) int(3) int(0) int(10) AMQPConnectionException(540): Server connection error: 540, message: NOT_IMPLEMENTED - prefetch_size!=0 (%d) bool(false) bool(false) int(0) int(10) amqp-2.1.2/tests/bug_gh72-1.phpt0000644000076500000240000000106014553444053016026 0ustar lstrojnystaff--TEST-- #72 Publishing to an exchange with an empty name is valid and should not throw an exception (1) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $exchange = new AMQPExchange($channel); $exchange->setName(''); $exchange->publish('msg', 'key'); ?> ==DONE== --EXPECT-- ==DONE== amqp-2.1.2/tests/bug_gh72-2.phpt0000644000076500000240000000134114553444053016031 0ustar lstrojnystaff--TEST-- #72 Publishing to an exchange with an empty name is valid and should not throw an exception (2) --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $channel = new AMQPChannel($cnn); $exchange = new AMQPExchange($channel); try { $exchange->setName(str_repeat('a', 256)); } catch (AMQPExchangeException $e) { echo get_class($e), "({$e->getCode()}): ", $e->getMessage(), PHP_EOL; } ?> --EXPECT-- AMQPExchangeException(0): Invalid exchange name given, must be less than 255 characters long. amqp-2.1.2/tests/ini_validation_failure.phpt0000644000076500000240000001063614553444053020775 0ustar lstrojnystaff--TEST-- Bad INI settings are rejected --SKIPIF-- --INI-- amqp.host=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx amqp.vhost=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx amqp.port=-1 amqp.login=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 amqp.password=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 amqp.read_timeout=-1 amqp.write_timeout=-1 amqp.connect_timeout=-1 amqp.rpc_timeout=-1 amqp.timeout=-1 amqp.prefetch_count=-1 amqp.prefetch_size=-1 amqp.global_prefetch_count=-1 amqp.global_prefetch_size=-1 amqp.heartbeat=-1 amqp.channel_max=257 amqp.frame_max=-1 --FILE-- ==DONE== --EXPECT-- string(9) "localhost" string(1) "/" string(4) "5672" string(5) "guest" string(5) "guest" string(1) "0" string(1) "0" string(1) "0" string(1) "0" string(0) "" string(1) "3" string(1) "0" string(1) "0" string(1) "0" string(1) "0" string(3) "256" string(6) "131072" ==DONE==amqp-2.1.2/tests/package-version.phpt0000644000076500000240000000164114553444053017347 0ustar lstrojnystaff--TEST-- Compare version in package.xml and module --SKIPIF-- --FILE-- version->release; $ext = new ReflectionExtension('amqp'); $srcVersion = $ext->getVersion(); if (0 === strcmp($packageVersion, $srcVersion)) { echo "package.xml matches phpinfo() output\n"; } else { printf("src version: %s, package.xml: %s\n", $srcVersion, $packageVersion); } if (0 === strcmp($packageVersion, $ext->getVersion())) { echo "package.xml matches extension version\n"; } else { printf("ext version: %s, package.xml: %s\n", $ext->getVersion(), $packageVersion); } --EXPECT-- package.xml matches phpinfo() output package.xml matches extension version amqp-2.1.2/tests/serialize-custom-amqpvalue-errors.phpt0000644000076500000240000000275614553444053023103 0ustar lstrojnystaff--TEST-- Serialize custom AMQP value - errors --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('ex-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declare(); class RecursiveValue implements AMQPValue { public function toAmqpValue() { return $this; } } class NestedValue implements AMQPValue { private $v; public function __construct($v) { $this->v = $v; } public function toAmqpValue() { return $this->v; } } try { $ex->publish('msg', null, null, ['headers' => ['x-val' => new RecursiveValue()]]); } catch (AMQPException $e) { var_dump($e->getMessage()); } $ex->publish('msg', null, null, ['headers' => ['x-val' => new NestedValue(new stdClass())]]); $ex->publish('msg', null, null, ['headers' => ['x-val' => new NestedValue(new NestedValue(new stdClass()))]]); ?> ==DONE== --EXPECTF-- string(%d) "Maximum serialization depth of 128 reached while serializing value" Warning: AMQPExchange::publish(): Ignoring field 'x-val' due to unsupported value type (object) in %s on line %d Warning: AMQPExchange::publish(): Ignoring field 'x-val' due to unsupported value type (object) in %s on line %d ==DONE==amqp-2.1.2/tests/serialize-custom-amqpvalue.phpt0000644000076500000240000000357614553444053021572 0ustar lstrojnystaff--TEST-- Serialize custom AMQP value --SKIPIF-- --FILE-- setHost(getenv('PHP_AMQP_HOST')); $cnn->connect(); $ch = new AMQPChannel($cnn); $ex = new AMQPExchange($ch); $ex->setName('ex-' . bin2hex(random_bytes(32))); $ex->setType(AMQP_EX_TYPE_FANOUT); $ex->declare(); $q = new AMQPQueue($ch); $q->setName('q-' . bin2hex(random_bytes(32))); $q->declare(); $q->bind($ex->getName()); class MyAmqpValue implements AMQPValue { public function toAmqpValue() { return 'foo'; } } class MyNestedAmqpValue implements AMQPValue { private $val; public function __construct($val) { $this->val = $val; } public function toAmqpValue() { return $this->val; } } $ex->publish('msg', null, null, ['headers' => [ 'x-val' => new MyAmqpValue(), 'x-nested' => new MyNestedAmqpValue(new MyAmqpValue()), 'x-array' => [new MyNestedAmqpValue(new MyAmqpValue())], 'x-array-nested' => new MyNestedAmqpValue([new MyNestedAmqpValue(1), 2]), 'x-nested-decimal' => new MyNestedAmqpValue(new AMQPDecimal(1, 2345)), 'x-nested-timestamp' => new MyNestedAmqpValue(new AMQPTimestamp(987)) ]]); $msg = $q->get(AMQP_AUTOACK); var_dump($msg->getHeader('x-val')); var_dump($msg->getHeader('x-nested')); var_dump($msg->getHeader('x-array')); var_dump($msg->getHeader('x-array-nested')); var_dump($msg->getHeader('x-nested-decimal')->getExponent()); var_dump($msg->getHeader('x-nested-decimal')->getSignificand()); var_dump($msg->getHeader('x-nested-timestamp')->getTimestamp()); ?> ==DONE== --EXPECT-- string(3) "foo" string(3) "foo" array(1) { [0]=> string(3) "foo" } array(2) { [0]=> int(1) [1]=> int(2) } int(1) int(2345) float(987) ==DONE==amqp-2.1.2/tests/testtest.phpt0000644000076500000240000000342114553444053016146 0ustar lstrojnystaff--TEST-- Test the tests --FILE-- .*?)--[A-Z]+--/s', $content, $matches)) { printf("%s TEST section cannot be parsed\n", basename($test)); continue; } ['testCode' => $testCode] = $matches; if (!preg_match('/--SKIPIF--(?P.*?)--[A-Z]+--/s', $content, $matches)) { printf("%s SKIPIF section cannot be parsed\n", basename($test)); continue; } ['skipCode' => $skipCode] = $matches; if (!preg_match('/if\s*\(!extension_loaded\("amqp"\)\)\s*\{?\s*print "skip AMQP extension is not loaded";/', $skipCode)) { printf("%s --SKIP-- does not check for the extension being present\n", basename($test)); continue; } $hostVars = ['PHP_AMQP_HOST', 'PHP_AMQP_SSL_HOST']; foreach ($hostVars as $hostVar) { if (strpos($testCode, $hostVar) !== false && !preg_match('/!getenv\(["\']' . $hostVar . '/', $skipCode)) { printf("%s --TEST-- contains reference to %s but --SKIP-- does not check for it\n", basename($test), $hostVar); continue 2; } if (strpos($testCode, $hostVar) === false && strpos($skipCode, $hostVar) !== false) { printf("%s --TEST-- contains no reference to %s but --SKIP-- checks for reference\n", basename($test), $hostVar); continue 2; } } } ?> ==DONE== --EXPECT-- ==DONE==amqp-2.1.2/stubs/AMQP.php0000644000076500000240000001104014553444053014633 0ustar lstrojnystaff amqp.host The host to connect too. Note: Max 1024 characters. * 'port' => amqp.port Port on the host. * 'vhost' => amqp.vhost The virtual host on the host. Note: Max 128 characters. * 'login' => amqp.login The login name to use. Note: Max 128 characters. * 'password' => amqp.password Password. Note: Max 128 characters. * 'read_timeout' => Timeout in for consume. Note: 0 or greater seconds. May be fractional. * 'write_timeout' => Timeout in for publish. Note: 0 or greater seconds. May be fractional. * 'connect_timeout' => Connection timeout. Note: 0 or greater seconds. May be fractional. * 'rpc_timeout' => Timeout for RPC-style AMQP methods. Note: 0 or greater seconds. May be fractional. * * Connection tuning options (see http://www.rabbitmq.com/amqp-0-9-1-reference.html#connection.tune for details): * 'channel_max' => Specifies highest channel number that the server permits. 0 means standard extension limit * (see PHP_AMQP_MAX_CHANNELS constant) * 'frame_max' => The largest frame size that the server proposes for the connection, including frame header * and end-byte. 0 means standard extension limit (depends on librabbimq default frame size limit) * 'heartbeat' => The delay, in seconds, of the connection heartbeat that the server wants. * 0 means the server does not want a heartbeat. Note, librabbitmq has limited heartbeat support, * which means heartbeats checked only during blocking calls. * * TLS support (see https://www.rabbitmq.com/ssl.html for details): * 'cacert' => Path to the CA cert file in PEM format.. * 'cert' => Path to the client certificate in PEM foramt. * 'key' => Path to the client key in PEM format. * 'verify' => Enable or disable peer verification. If peer verification is enabled then the common name in the * server certificate must match the server name. Peer verification is enabled by default. * * 'connection_name' => A user determined name for the connection * ) * * @param array $credentials Optional array of credential information for * connecting to the AMQP broker. */ public function __construct(array $credentials = []) { } /** * Check whether the connection to the AMQP broker is still valid. * * Cannot reliably detect dropped connections or unusual socket errors, as it does not actively * engage the socket. * * @return boolean TRUE if connected, FALSE otherwise. */ public function isConnected(): bool { } /** * Whether connection persistent. * * When no connection is established, it will always return FALSE. The same disclaimer as for * {@see AMQPConnection::isConnected()} applies. * * @return boolean TRUE if persistently connected, FALSE otherwise. */ public function isPersistent(): bool { } /** * Establish a transient connection with the AMQP broker. * * This method will initiate a connection with the AMQP broker. * * @throws AMQPConnectionException */ public function connect(): void { } /** * Closes the transient connection with the AMQP broker. * * This method will close an open connection with the AMQP broker. * * @throws AMQPConnectionException When attempting to disconnect a persistent connection */ public function disconnect(): void { } /** * Close any open transient connections and initiate a new one with the AMQP broker. * * @throws AMQPConnectionException */ public function reconnect(): void { } /** * Establish a persistent connection with the AMQP broker. * * This method will initiate a connection with the AMQP broker * or reuse an existing one if present. * * @throws AMQPConnectionException */ public function pconnect(): void { } /** * Closes a persistent connection with the AMQP broker. * * This method will close an open persistent connection with the AMQP * broker. * * @throws AMQPConnectionException When attempting to disconnect a transient connection */ public function pdisconnect(): void { } /** * Close any open persistent connections and initiate a new one with the AMQP broker. * * @throws AMQPConnectionException */ public function preconnect(): void { } /** * Get the configured host. * * @return string The configured hostname of the broker */ public function getHost(): string { } /** * Get the configured login. * * @return string The configured login as a string. */ public function getLogin(): string { } /** * Get the configured password. * * @return string The configured password as a string. */ public function getPassword(): string { } /** * Get the configured port. * * @return int The configured port as an integer. */ public function getPort(): int { } /** * Get the configured vhost. * * @return string The configured virtual host as a string. */ public function getVhost(): string { } /** * Set the hostname used to connect to the AMQP broker. * * @param string $host The hostname of the AMQP broker. * * @throws AMQPConnectionException If host is longer then 1024 characters. */ public function setHost(string $host): void { } /** * Set the login string used to connect to the AMQP broker. * * @param string $login The login string used to authenticate * with the AMQP broker. * * @throws AMQPConnectionException If login is longer then 32 characters. */ public function setLogin(string $login): void { } /** * Set the password string used to connect to the AMQP broker. * * @param string $password The password string used to authenticate * with the AMQP broker. * * @throws AMQPConnectionException If password is longer then 32characters. */ public function setPassword(string $password): void { } /** * Set the port used to connect to the AMQP broker. * * @param integer $port The port used to connect to the AMQP broker. * * @throws AMQPConnectionException If port is longer not between * 1 and 65535. */ public function setPort(int $port): void { } /** * Sets the virtual host to which to connect on the AMQP broker. * * @param string $vhost The virtual host to use on the AMQP * broker. * * @throws AMQPConnectionException If host is longer then 32 characters. */ public function setVhost(string $vhost): void { } /** * Sets the interval of time to wait for income activity from AMQP broker * * @deprecated use AMQPConnection::setReadTimeout($timeout) instead * * @throws AMQPConnectionException If timeout is less than 0. */ public function setTimeout(float $timeout): void { } /** * Get the configured interval of time to wait for income activity * from AMQP broker * * @deprecated use AMQPConnection::getReadTimeout() instead */ public function getTimeout(): float { } /** * Sets the interval of time (in seconds) to wait for income activity from AMQP broker * * @throws AMQPConnectionException If timeout is less than 0. */ public function setReadTimeout(float $timeout): void { } /** * Get the configured interval of time (in seconds) to wait for income activity * from AMQP broker */ public function getReadTimeout(): float { } /** * Sets the interval of time (in seconds) to wait for outcome activity to AMQP broker * * @throws AMQPConnectionException If timeout is less than 0. */ public function setWriteTimeout(float $timeout): void { } /** * Get the configured interval of time (in seconds) to wait for outcome activity * to AMQP broker */ public function getWriteTimeout(): float { } /** * Get the configured timeout (in seconds) for connecting to the AMQP broker */ public function getConnectTimeout(): float { } /** * Sets the interval of time to wait (in seconds) for RPC activity to AMQP broker * * @throws AMQPConnectionException If timeout is less than 0. */ public function setRpcTimeout(float $timeout): void { } /** * Get the configured interval of time (in seconds) to wait for RPC activity * to AMQP broker */ public function getRpcTimeout(): float { } /** * Return last used channel id during current connection session. */ public function getUsedChannels(): int { } /** * Get the maximum number of channels the connection can handle. * * When connection is connected, effective connection value returned, which is normally the same as original * correspondent value passed to constructor, otherwise original value passed to constructor returned. */ public function getMaxChannels(): int { } /** * Get max supported frame size per connection in bytes. * * When connection is connected, effective connection value returned, which is normally the same as original * correspondent value passed to constructor, otherwise original value passed to constructor returned. */ public function getMaxFrameSize(): int { } /** * Get number of seconds between heartbeats of the connection in seconds. * * When connection is connected, effective connection value returned, which is normally the same as original * correspondent value passed to constructor, otherwise original value passed to constructor returned. */ public function getHeartbeatInterval(): int { } /** * Get path to the CA cert file in PEM format */ public function getCACert(): ?string { } /** * Set path to the CA cert file in PEM format */ public function setCACert(?string $cacert): void { } /** * Get path to the client certificate in PEM format */ public function getCert(): ?string { } /** * Set path to the client certificate in PEM format */ public function setCert(?string $cert): void { } /** * Get path to the client key in PEM format */ public function getKey(): ?string { } /** * Set path to the client key in PEM format */ public function setKey(?string $key): void { } /** * Get whether peer verification enabled or disabled */ public function getVerify(): bool { } /** * Enable or disable peer verification */ public function setVerify(bool $verify): void { } /** * set authentication method * * @param int $saslMethod AMQP_SASL_METHOD_PLAIN | AMQP_SASL_METHOD_EXTERNAL */ public function setSaslMethod(int $saslMethod): void { } public function getSaslMethod(): int { } public function setConnectionName(?string $connectionName): void { } public function getConnectionName(): ?string { } } amqp-2.1.2/stubs/AMQPConnectionException.php0000644000076500000240000000021114553444053020530 0ustar lstrojnystaff= 0.5.3) */ public function setFlags(?int $flags): void { } /** * Set the name of the exchange. * * @param string|null $exchangeName The name of the exchange to set as string. */ public function setName(?string $exchangeName): void { } /** * Set the type of the exchange. * * Set the type of the exchange. This can be any of AMQP_EX_TYPE_DIRECT, * AMQP_EX_TYPE_FANOUT, AMQP_EX_TYPE_HEADERS or AMQP_EX_TYPE_TOPIC. * * @param string|null $exchangeType The type of exchange as a string. */ public function setType(?string $exchangeType): void { } /** * Get the AMQPChannel object in use */ public function getChannel(): AMQPChannel { } /** * Get the AMQPConnection object in use */ public function getConnection(): AMQPConnection { } } amqp-2.1.2/stubs/AMQPExchangeException.php0000644000076500000240000000020514553444053020156 0ustar lstrojnystaff