是否可以使用php和curl在mysql中进行多个连接的交易

时间:2014-01-30 16:53:37

标签: php mysql transactions

我的任务是创建一些API的集成测试,并且想知道是否可以做一些像开始事务的事情;卷起几个api电话;回滚数据库。

示例伪代码

begin_long_transaction();
$userId = (new CURL('user/create', $dataArr))->post();
(new CURL("user/$userId", $updateDataArr))->put();
$userData = (new CURL("user/$userId"))->get();

// assert userData is as expected
rollback_long_transaction();

2 个答案:

答案 0 :(得分:0)

是的,可以这样做。 通常你会嘲笑这个,但它可以进行实时API测试。 您正在使用PHP,因此选择的工具是phpUnit。

如果您使用phpUnit,我建议扩展PHPUnit_Framework_TestCase或PHPUnit_Extensions_Database_TestCase,并使用您的beginLongTransaction()和rollbackLongTransaction()以及api()方法构建自定义类。

让我们假设像request($ type,$ url,$ data)这样的东西,所以你不必经常输入“new Curl”。 $this->request('GET, '/somewhere', $data);

还有一个setUp()和tearDown()用于在TestCase之前和之后执行操作。

留意超时时间&相应地设置PHP执行时间,因为某些测试可能会遇到连接超时,因为它依赖于外部API。 您也可以将测试分组并单独运行,以避免超时。

class MyApiTest1 extends MyCustomAPI_PHPUnit_Framework_TestCase
{
    // connection per test
    public function testSomething()
    {
        $this->useConnection($connectionName);

        $result = $this->request('GET', '/user/' . $this->getDb()->getUsername());

        $this->assertEquals(200, $result->getResponse()->getStatusCode());

        $this->closeConnection($connectionName);
    }
}

class MyApiTest2 extends MyCustomAPI_PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        $this->useConnection($connectionName);
    }

    // connection per class
    public function testSomething()
    {
        $result = $this->request('GET', '/test');

        $this->assertEquals(200, $result->getResponse()->getStatusCode());
    }

    public function tearDown()
    {
         $this->closeConnection($connectionName);
    }
}

使用多个数据库连接和一个请求方法的基类:

class MyCustomAPI_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase
{
    static public $dbConnections = array();

    function setupConnections()
    {
        // foreach array(databaseName => credentials)
        {
           // create connection object
           // store connection object into array
           self::$dbConnections[$databaseName] = $connection;
        }
    }

    function getConnection($connectionName)
    {
        return self::$dbConnections[$connectionName];
    }

    function rollback($connectionName)
    {
        $con = $this->getConnection($connectionName);

        // rollback hard
        $con->deleteDatabase();
        $con->insertDatabaseSchema();
        $con->insertDatabaseData();

        // = database @fresh start
    }

    function beginTransaction($connectionName)
    {
        $con = $this->getConnection($connectionName);

        // do stuff on begin

        return $con;
    }

    function request($type, $url, $data)
    {
        // do curl request

        return $cURLdata;
    }

}

答案 1 :(得分:-1)

看起来你正在使用CURL通过一个拥有自己的MySQL数据库连接池的服务来点击网络中其他地方实现的服务。

所以,你的问题的答案是“不”。

以下是来自另一个SO问题的更多信息。

MySQL: Transactions across multiple threads