Hi! On 07.08.2019 at 10:03, Qianqian Bu via pecl-dev wrote:
> Dear Madam/Sir, > > My name is Qianqian Bu, I'm from Microsoft company and recently work on a > project which enables redirection functionality for MySQL servers using PHP > mysqlnd driver. The functionality has been implemented as a PHP extension > using mysqlnd plugin API, and I'd like to request submitting it to PECL > website. > > There is a document https://jira.mariadb.org/browse/MDEV-15935 for MariaDB > Connector J for the same purpose which you may use as a reference. The > document gives the purpose and initial approach. The final implementation > takes use of the message field of OK packet, server fills the message field > with redirection information, then driver side needs extract the information > and use it to establish a new connection. There is a ongoing pull request > https://github.com/MariaDB/mariadb-connector-j/pull/134 for MariaDB > Connector J for this, which you may also use as a reference. Following is the > detailed description of the scenario and extension solution for PHP mysqlnd. > > Scenario (same as described in MDEV-15935): > Currently when multiple servers share one proxy, proxy forwards all the > packets between servers and clients. Thus, the proxy adds latency, take many > computing resources and impacts the overall performance. Especially for short > connections scenarios like WordPress, the latency can be a critical issue. > Supporting redirection mechanism is helpful for proxy-based scenario. It is > more like HTTP redirects or Oracle redirected connections. Clients get the > servers' address from proxies and connect to servers transparently without > latency and computing resource wasted. > > Extension solution: > We implement the solution as a PECL style extension using mysqlnd plugin API, > and the basic idea is modifying the MYSQLND_METHOD(mysqlnd_data, connect) > method, make it possible to establish a new connection based on the > redirection information provided by the response OK packet in the last > message field, and use the new connection if connection succeed. And then > cache the redirection information, so next time, it only need one > establishment phase to connect to MySQL server. > There are three MYSQLND_METHOD methods replaced as follows: > conn_m->connect = MYSQLND_METHOD(mysqlnd_rd, connect); > conn_d_m->connect = MYSQLND_METHOD(mysqlnd_rd_data, connect); > conn_d_m->dtor = MYSQLND_METHOD_PRIVATE(mysqlnd_rd_data, dtor); > > And I've modified the interface of MYSQLND_METHOD(mysqlnd_rd_data, connect) a > little, make the first parameter as MYSQLND_CONN_DATA ** instead of > MYSQLND_CONN_DATA *, so I can modify the content of the connection object the > pointer points to. > After the first connection established and before send the init_command which > may update last message field: > { > const MYSQLND_CSTRING scheme = { transport.s, transport.l }; > if (FAIL == conn->m->connect_handshake(conn, &scheme, > &username, &password, &database, mysql_flags)) { > goto err; > } > } > Try to establish a new connection: > enum_func_status redirectState = > redirect_conn->m->connect_handshake(redirect_conn, &redirect_scheme, > &redirect_username, &password, &database, mysql_flags); > If succeeds, close the original connection, and update the connection > information: > conn->m->send_close(conn); > conn->m->dtor(conn); > ... > conn = redirect_conn; > ... > *pconn = redirect_conn; //use new conn outside for caller > ... > hostname = redirect_hostname; > username = redirect_username; > port = ui_redirect_port; Thanks for the detailed explanation. From what I can tell, this looks good to me. > I've presented the code to @Christoph Becker (HAYS Professional Solutions > GM)<mailto:a-chb...@microsoft.com> before. Since currently the code is hold > on a private repository, and there is a limit foe email size so I cannot add > it in the attachment, may I ask how should I present the code to you? One option could be to move it to a public Github repository. Some other PECL extensions are also hosted there (e.g. Imagick[1]). > The code does not have a package.xml yet, from > https://pear.php.net/manual/en/pyrus.commands.pickle.php it says that I can > use picke with pyrus.phar to generate the package file, but it seems > pyrus.phar cannot work with PHP7. I cannot find pyrus.phar from pear2.php.net > as described on > https://pear.php.net/manual/en/installationpyrus.introduction.php, and the > download version from https://github.com/pyrus/Pyrus does not work, and the > repo has not been updated for many years. May I ask can you give me some help > about how to generate the package.xml file? I've filed a bug report regarding the obviously out-dated Pyrus documentation[2]. It seems to me that you would have to write the package.xml manually. :( [1] <https://github.com/Imagick/imagick> [2] <https://pear.php.net/bugs/bug.php?id=23840> Thanks, Christoph -- PECL development discussion Mailing List (http://pecl.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php